一文搞定Android VSync机制来龙去脉

本文详细阐述了VSync的起源,如何在PC和Android系统中防止屏幕撕裂,以及Android中VSync与Choreographer和TripleBuffer的关系。特别介绍了VSync的虚拟化设计,以简化App和SurfaceFlinger对VSync的依赖。

1. VSync的起源

显示屏上一帧画面的显示过程,是像素自上而下逐行扫描的过程,如果在上一帧的扫描还没有结束的情况下,屏幕又开始扫描下一帧的像素,那么就会出现如下图中撕裂(tearing)的情况。


这个问题最初是在PC上被重视和解决的,GPU厂商开发出了一种防止屏幕被撕裂的技术方案,全称Vertical Synchronization(中文名垂直同步,简称VSync)。基本思路就是在屏幕刷新之前向外提供一个信号,主机端根据此信号选择合适的策略完成画面的刷新,避免数据刷新和屏幕扫描不匹配(撕裂)的情况发生。所以VSync信号也叫做TE信号或VBlank信号。

下图展示了开启与关闭Vsync的状态下,屏幕画面的不同显示情况。这里需要先说明一下传统的显示架构,主要有三部分组成,

  • 第一部分负责渲染,包含CPU,GPU及一些系统模块;
  • 第二部分叫做帧缓冲,实质上是一块内存块,渲染完的数据会被保存在这块内存中;
  • 第三部分是屏幕,用来绘制帧缓冲上的数据。

一般来说帧缓冲会有两块,一块叫做backbuffer,用来写入渲染数据,一块叫做frontbuffer,用来把渲染数据送给屏幕。

这两块buffer的状态是不断变化的,也就是说当backbuffer被写入完数据等待显示时,它就变成了frontbuffer而当frontbuffer的数据被显示完毕之后,它就变成了backbuffer。

  • VSync off:

Android 的 **VSYNC(垂直同步)渲染机制** 是 Android 系统为了解决 UI 渲染卡顿、掉帧等问题而引入的一种**同步机制**。它的核心目标是让应用的 UI 渲染与屏幕刷新保持同步,从而提升 UI 流畅性。 --- ### 🧠 VSYNC 的基本原理 - 屏幕的刷新率通常是 **60Hz**,意味着屏幕每秒刷新 60 次,即每 **16.67 毫秒**刷新一次。 - Android 系统通过 **VSYNC 信号** 来通知系统和应用:**现在是绘制下一帧的最佳时机**。 - 应用程序必须在下一个 VSYNC 信号到来之前完成绘制,否则就会**掉帧**,用户会感知卡顿。 --- ### 🧱 Android 渲染流程中的 VSYNC 1. **VSYNC 信号到来** - 由系统底层(SurfaceFlinger)发出。 2. **Choreographer 接收 VSYNC** - 每个线程的 Looper 会绑定一个 `Choreographer` 实例。 - 它负责调度 UI 渲染任务。 3. **执行 UI 渲染任务** - 包括: - Measure(测量) - Layout(布局) - Draw(绘制) 4. **渲染完成提交到 SurfaceFlinger** - SurfaceFlinger 合成所有图层,提交给显示系统。 5. **等待下一个 VSYNC 信号** --- ### 📈 Choreographer 的作用 `Choreographer` 是 Android 渲染机制的核心类,它负责: - 接收 VSYNC 信号 - 调度绘制任务(`Traversal`) - 控制动画、输入事件等的时间同步 你可以通过以下方式获取当前线程的 Choreographer: ```java Choreographer choreographer = Choreographer.getInstance(); ``` --- ### 📊 渲染性能监控 你可以使用以下方式分析 UI 渲染性能: - **GPU 渲染模式分析**(在开发者选项中) - **adb shell dumpsys gfxinfo <包名>** - **Android Studio Profiler > CPU/FPS** - **Systrace(系统追踪)** --- ### ⚠️ 掉帧(Jank)的原因 - 主线程执行耗时操作(如网络请求、复杂计算) - UI 布局层级过深 - 自定义 View 绘制效率低 - 动画执行时间过长 - 内存抖动(频繁 GC) --- ### ✅ 优化建议 1. **避免在主线程做耗时操作** 2. **减少布局层级,使用 `ConstraintLayout`** 3. **避免过度绘制(Overdraw)** 4. **使用 `ViewStub`、`include`、`merge` 优化布局** 5. **使用 GPU Profiling 工具分析渲染性能** --- ### ✅ 总结 | 模块 | 描述 | |------|------| | VSYNC 信号 | 每 16ms 发送一次,用于同步 UI 渲染 | | Choreographer | 调度 UI 渲染任务,接收 VSYNC 信号 | | 渲染目标 | 每帧渲染时间 < 16ms,避免掉帧 | | 掉帧原因 | 超出 16ms 的绘制或计算 | | 监控工具 | GPU Rendering、gfxinfo、Profiler、Systrace | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值