当前位置: 首页 > news >正文

android-屏幕-刷新流程

Android 屏幕刷新是一个涉及硬件、系统服务和应用的协同过程,核心目标是保证画面流畅且避免撕裂。其关键流程如下:

  1. 刷新触发:VSync 信号

    • 屏幕硬件完成一帧画面的逐行扫描(从左到右,从上到下)后,会发出垂直同步信号(VSync),标志着一个垂直消隐(VBlank)间隔的开始。
    • 此信号是刷新周期的起点,驱动整个显示流水线同步运作。
  2. 应用层响应:UI 绘制

    • Android 系统的 Choreographer 组件会监听 VSync 信号。
    • 收到 VSync 信号后,Choreographer 会回调应用的 onDraw() 方法,触发 UI 树(View 树)的测量(Measure)、布局(Layout)和绘制(Draw)操作。
    • 应用的绘制结果(位图)会被提交到 Surface 关联的 BufferQueue 的生产者缓冲区(Producer Buffer)中。
  3. 系统合成:SurfaceFlinger

    • SurfaceFlinger(系统合成服务)也在监听 VSync 信号。
    • 在 VSync 信号到来时,SurfaceFlinger 会被唤醒。
    • 它遍历所有需要显示的 Surface(对应各个应用窗口或系统 UI),检查其 BufferQueue 中是否有准备好的新帧缓冲区(Buffer)。
    • 如果有新帧可用,SurfaceFlinger 会将所有必要的 Buffer 数据交给硬件混合渲染器(HWC)进行最终合成(或自行进行 GPU 合成)。
  4. 硬件显示:帧提交

    • 合成后的最终帧数据被放置到显示控制器指定的帧缓冲区(Frame Buffer)中。
    • 在下一个 VSync 信号到来时(标志着 VBlank 结束),显示控制器(Display Controller)会将此 Frame Buffer 中的数据取出,开始新一帧的逐行扫描显示过程。

关键机制解析:

  • 双缓冲(Triple Buffering): 系统使用至少两个缓冲区(通常称为“前缓冲”和“后缓冲”)来避免画面撕裂和提升效率。
    • GPU 渲染: GPU 将应用绘制的内容渲染到“后缓冲”。
    • 缓冲区交换: VSync 信号到来时,系统交换“前缓冲”和“后缓冲”。此时,“前缓冲”的内容被送交显示,“后缓冲”则变为空闲供 GPU 渲染下一帧。
    • 三缓冲: 在高负载场景下引入第三个缓冲区,允许 GPU 在上一帧尚未显示完时就开始渲染更下一帧,进一步减少卡顿。
  • 掉帧(Jank): 如果在 VSync 信号到来时,GPU 未能完成当前帧的渲染(耗时超过 16.6ms @60Hz),缓冲区无法交换。屏幕将继续显示上一帧的内容,直到下一个 VSync 信号到来且新帧准备就绪。这导致了用户感知到的卡顿或掉帧。
  • 画面撕裂(Tearing): 如果未使用 VSync 同步机制,在屏幕扫描显示的过程中,显示器读取的缓冲区数据可能被 GPU 中途更新,导致一帧画面上下部分显示的是不同帧的数据,即撕裂现象。VSync 和双缓冲机制有效地解决了这个问题。

总结流程表:

阶段主要参与者关键动作触发点
1. 扫描完成屏幕硬件完成当前帧扫描,发出 VSync 信号,进入 VBlank 期扫描线归位
2. 应用绘制应用、Choreographer收到 VSync, 执行 onDraw(),提交新帧到 BufferQueueVSync 信号
3. 表面合成SurfaceFlinger、HWC收到 VSync, 收集各 BufferQueue 新帧,进行图层合成VSync 信号
4. 缓冲区交换系统交换前后缓冲区 (或标记合成结果到帧缓冲)VSync 信号
5. 新帧扫描显示显示控制器、屏幕从帧缓冲取出数据,开始新一帧的逐行扫描显示VSync 信号

引用链接:
1.【Android】屏幕刷新机制(概览) - CSDN博客
2.Android VSync 核心机制深入解读 - 掘金开发者社区
3.android屏幕刷新之一_如何根据 trace 图形日志分析界面刷新和bufferqueue问题-CSDN博客 - CSDN博客
4.Android屏幕刷新机制—VSync、Choreographer-全面理解! - CSDN博客
5.屏幕刷新原理 - 无我
6.Android的VSYNC机制和UI刷新流程示例详解 - 脚本之家
7.“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解! - 51CTO博客
8.Android 屏幕刷新机制 - 掘金开发者社区
9.Android 设置屏幕刷新率 - 51CTO博客
10.手机怎么刷新? - 爱奇艺
11.小米14,小米14Pro首发实测,骁龙8gen3刷新安卓最强 - 哔哩哔哩
12.Android渲染机制之多缓冲和VSYNC - 哔哩哔哩
13.手机高刷在哪里设置 - 技术精英
14.华为手机怎么刷新一下 - 研阁间
15.华为手机刷新率怎么设置 - 有文故事坊
16.华为手机刷新怎么刷新 - 车研智库
17.华为高刷在哪设置 - VicFrame
18.手机怎么刷屏 - 力学侠解难题
19.华为手机怎么刷新页面 - Sherry环球投基
20.深入浅出:Android屏幕刷新机制_android ondisplaychanged-CSDN博客 - CSDN博客
21.android 品目刷新 android屏幕刷新机制 - 51CTO博客

http://www.lryc.cn/news/602458.html

相关文章:

  • 《深入剖析Kafka分布式消息队列架构奥秘》之Kafka基本知识介绍
  • MCU 中的 PWM(脉冲宽度调制)是什么?
  • uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android
  • LeetCode 刷题【18. 四数之和】
  • R 语言科研绘图 --- 其他绘图-汇总1
  • 2025 DevOps工具生态全景解读:本土化服务与智能化演进成关键赛点
  • Centos 7 命令:ip addr
  • 国产测试用例管理工具横向评测:DevOps时代如何选择最适合的协作平台?
  • 问题大全【1】
  • LWGJL教程(8)——基础知识
  • 游戏测试与软件测试的区别
  • 安全风险监测系统是什么?内容有哪些?
  • 关于联想M6201d-00 升级的几点总结
  • 【大模型LLM】大模型微调 应对显存限制和训练加速 常用的优化策略
  • 决策树算法小结(中)
  • git 使用 rebase 删除某次 提交
  • 【优先级高,先补充】基于文本增强跨模态特征交互注意网络的多模态情感分析
  • 机器学习与深度学习评价指标
  • linux函数 mmap详解
  • 15-C语言:第15天笔记
  • TCPIP之常用协议
  • 工业前端组件库重构心法:如何让开发效率提升60%的交互模块设计逻辑
  • java中一些数据结构的转换
  • 函数的“握手协议”:揭秘C++调用惯例(cdecl, stdcall)的秘密
  • 【智慧物联网平台】安装部署教程——仙盟创梦IDE
  • 重构vite.config.json
  • C++中既重要又困难的部分—类和对象
  • 数据可视化待办清单:用JS打造你的第一个Web应用
  • 深度解析Manus:从多智能体架构到通用AI Agent的技术革命
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现面部口罩的检测识别(C#代码,UI界面版)