落叶知秋|程序员必懂的Android 技术之 VSYNC、 Choreographer 起源
1
Project Butter
现在我们已经很少能够听到关于 Android UI 卡顿的话题了 , 这得益于 Google 长期以来对 Android 渲染性能的重视 , 基本每次 Google I/O 都会花很多篇幅讲这一块 。 随着时间的推移 , Android 系统一直在不断进化、壮大 , 并且日趋完善 。
其中 , Google 在 2012 年的 I/O 大会上宣布了 Project Butter 黄油计划 , 那个曾经严重影响 Android 口碑的 UI 流程性问题 , 首先在这得到有效的控制 , 并且在 Android 4.1 中正式开启了这个机制 。
Project Butter 对 Android Display 系统进行了重构 , 引入了三个核心元素 , 即 VSYNC、Triple Buffer 和 Choreographer 。
其中 VSYNC 是理解 Project Butter 的核心 。 接下来 , 我们就围绕 VSYNC 开始介绍 Project Butter 对 Android Display 系统做了哪些优化 。
2
VSYNC
VSYNC 最初是由 GPU 厂商开发的一种 , 用于防止屏幕撕裂的技术方案 , 全称 Vertical Synchronization , 该方案很早就已经被广泛应用于 PC 上 。 我们可以把它理解为一种时钟中断 。
1. 前世VSYNC 是一种图形技术 , 它可以同步 GPU 的帧速率和显示器的刷新频率 , 所以在理解 VSYNC 产生的原因及其作用之前 , 我们有必要先来了解下这两个概念 。
刷新频率(Refresh Rate)
表示屏幕在一秒内刷新画面的次数 ,刷新频率取决于硬件的固定参数 , 单位 Hz(赫兹) 。 例
如常见的 60 Hz、144 Hz , 即每秒钟刷新 60 次或 144 次 。
逐行扫描
显示器并不是一次性将画面显示到屏幕上 , 而是从左到右边 , 从上到下逐行扫描显示 , 不过这一过程快到人眼无法察觉到变化 。 以 60 Hz 刷新率的屏幕为例 , 即 1000 / 60 ≈ 16ms 。
帧速率 (Frame Rate)
表示 GPU 在一秒内绘制操作的帧数 , 单位 fps 。 例如在电影界采用 24 帧的速度足够使画面运行的非常流畅 。 而 Android 系统则采用更加流畅的 60 fps , 即每秒钟绘制 60 帧画面 。
屏幕撕裂
现在 , 刷新频率和帧率需要一起合作 , 才能使图形内容呈现在屏幕上 , GPU 会获取图形数据进行绘制 ,然后硬件负责把图像内容呈现到屏幕上 , 这一过程在应用程序的生命周期内一遍又一遍的发生 。
如上图 , CPU / GPU 生成图像的 Buffer 数据 , 屏幕从 Buffer 中读取数据刷新后显示 。
理想情况下帧率和刷新频率保持一致 , 即每绘制完成一帧 , 显示器显示一帧 。 不幸的是 , 刷新频率和帧率并不总是能够保持相对同步 , 如果帧速率实际比刷新率快 , 例如帧速率是 120 fps , 显示器的刷新频率为 60 Hz 。 此时将会发生一些视觉上的问题
当 GPU 利用一块内存区域写入一帧数据时 , 从顶部开始新一帧覆盖前一帧 , 并立刻输出一行内容 。 当屏幕刷新时 , 此时它并不知道图像缓冲区的状态 , 因此从缓冲区抓取的帧并不是完整的一帧画面(绘制和屏幕读取使用同一个缓冲区) 。
此时屏幕显示的图像会出现上半部分和下半部分明显偏差的现象 , 这种情况被称之为 “tearing”(屏幕撕裂) 。
发生 “tearing” 现象的根源是由于帧速率与刷新频率不一致导致 。
Double Buffer(双重缓存)那如何防止 “tearing” 现象的发生呢?由于图像绘制和读取使用的是同一个缓冲区 , 所以屏幕刷新时可能读取到的是不完整的一帧画面 。
推荐阅读
- 落叶知秋|中芯国际将被美国拉黑,鸿蒙系统已有进展,未来科技方向在何方?
- 落叶知秋|解析无源RFID与有源RFID在仓库管理各大优势
- 中式客厅该怎么挂画 一看就懂的5大实用布局原则
- 落叶知秋|揭秘,IT培训行业营销拓客秘籍
- 落叶知秋|科技强警||城中警方研发水下机器人亮相国内顶尖舞台
- 程序员|“对不起,我们不要IT培训班出来的程序员”!
- 小熊回收站|“对不起,我们不要IT培训班出来的程序员”
- 落叶知秋|用了一年的iPhone 8,现在的我终于要把它换掉了
- 小熊科技|程序员你是怎么绘制架构图?
- 程序员|程序员:代码全部替换成中文,你能接受吗?
