当前位置: 首页 > 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.dtcms.com/a/302330.html

相关文章:

  • .NET AI从0开始入门 SemanticKernel 从基础到实践
  • 【GIS数据分享】建筑矢量数据带高度
  • 数据链路层 和 ARP协议
  • 最大连续子数组
  • Makefile if语句用法
  • 【传奇开心果系列】Flet纵向瀑布流本地图片布局排列自定义模板
  • 【硬件】LVGL
  • 15-C语言:第15天笔记
  • keepalived原理及实战部署
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • 张 LLama 多语言语义相似度计算全解析:不同语言 同义词的相似度计算
  • idea启动java应用报错
  • idea编译报错 java: 非法字符: ‘\ufeff‘ 解决方案
  • OSPF笔记
  • 实验-静态路由
  • 解决windows系统下 idea、CLion 控制台中文乱码问题
  • 应急响应处置案例(上)
  • python-并发编程
  • 移动高清盒子6PRO-河南创维E900V22D-晶晨S905L3B-4+16G-安卓9-线刷固件包
  • 提取excel中的年月日
  • uniapp_微信小程序_根据胶囊按钮计算出的导航栏高度为什么不是44px?
  • 多光谱相机助力第四次全国农业普查-农业用地调查
  • Deepseek + browser-use 轻松实现浏览器自动化
  • 关于大视频大文件诸如超过5个G或10个G的视频上传详解原理以及-5种语言实现-优雅草卓伊凡|深蓝
  • 【7.26-7.28胜算云AI日报:首个开源3D世界生成模型腾讯混元、微软预示 8 月 GPT-5 发布、Nemotron推理、商汤悟能、DM夺金】
  • UniappDay04
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • 【uniapp】---- 使用 uniapp 实现视频和图片上传且都可以预览展示
  • NVMe高速传输之摆脱XDMA设计20:PCIe请求模块设计(上)
  • 【mysql慢查询】