Android显示刷新机制:VSYNC与三重缓存机制详解
Android显示刷新机制:VSYNC与三重缓存机制详解
在Android系统中,显示刷新机制是确保流畅用户体验的关键技术之一。本文将深入探讨VSYNC信号和三重缓存机制的工作原理,帮助开发者理解如何优化应用的渲染性能。
刷新率与帧率
为了理解APP是如何进行渲染的,我们需要了解手机硬件的工作原理,特别是刷新率和帧率的概念。
刷新率(Refresh Rate):代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。
帧率(Frame Rate):代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。
GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,它们两者不停地进行协作。
如果刷新率和帧率不相互协调工作,就会容易出现画面撕裂(Tearing)的现象,即画面上下两部分显示内容发生断裂,来自不同的两帧数据发生重叠。
Google的优化
从Android 4.1开始,谷歌引入了Project Butter(黄油计划),对Android Display系统进行了重构,引入了三个核心元素:VSYNC、Triple Buffer和Choreographer。
VSYNC信号
VSYNC(Vertical Synchronization)是一个古老的概念,也称为垂直同步。它指的是显卡的输出帧数和屏幕的垂直刷新率相同。在Android中,VSYNC信号是由屏幕(显示设备)产生的,并且以60fps的固定频率发送给Android系统,SurfaceFlinger接收这个信号。
当SurfaceFlinger接收到VSYNC信号后,会遍历其层列表,查找新的缓冲区。如果找到新的缓冲区,SurfaceFlinger会获取缓冲区;否则,会继续使用上一次获取的缓冲区。
使用VSYNC信号的效果
在没有VSYNC的情况下,如果CPU被占用,可能会导致丢帧。而使用VSYNC信号后,CPU会在新的一帧开始时立即处理显示内容,提升了渲染任务的优先级,优化了渲染性能。
但是,如果CPU/GPU的帧率小于Display的帧率,仍然会出现重复显示的情况。
Triple Buffer三重缓存机制
在双缓存机制中,UI总是先在Back Buffer中绘制,然后再和Front Buffer交换,渲染到显示设备中。理想情况下,这样一个刷新会在16ms内完成。
为了解决CPU空闲等待的问题,Android引入了三重缓存机制(Triple Buffer)。它利用CPU/GPU的空闲等待时间提前准备好数据,但不会立即使用。
虽然Triple Buffer可以提高渲染效率,但过多的缓存也会带来内存开销和数据失效等问题。因此,三个Buffer是最优选择。
总结
- 刷新率(Refresh Rate):代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。
- 帧率(Frame Rate):代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。
- GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,它们两者不停地进行协作。
- 如果刷新率和帧率不相互协调工作,就会容易出现画面撕裂(Tearing)的现象。
- 从Android 4.1开始,谷歌在黄油计划中,引入了三个核心元素,即VSYNC、Triple Buffer和Choreographer。
- VSYNC信号是由屏幕(显示设备)产生的,并且以60fps的固定频率发送给Android系统,Android系统中的SurfaceFlinger接收发送的VSYNC信号。VSYNC信号表明可对屏幕进行刷新而不会产生撕裂。