更多关于Android渲染性能请点击这里
刷新频率和帧频
理解VSYNC先要理解其他两个术语
- 刷新频率:每秒内屏幕更新显示的次数以赫兹(Hz)表示,取决于硬件
- 帧频:指GPU每秒可以绘制的帧数,例如:30帧每秒,60帧每秒
刷新频率和帧频同时工作从而在屏幕上显示图像,GPU获取数据并进行绘制,然后硬件会将其输出到屏幕上
![](https://i-blog.csdnimg.cn/blog_migrate/81eb3723d25f73784cb242fd4bce8f00.png)
图像撕裂
但问题来自于刷新频率和帧频不一定会以同样的频率出现,当帧率比刷新频率快时会出现一些视觉问题。
![](https://i-blog.csdnimg.cn/blog_migrate/97688a463891da195488216f1bba034a.png)
当你照相时拍了一张照片,旋转10度又拍了一张照片,这两张照片非常相似
![](https://i-blog.csdnimg.cn/blog_migrate/bf543db481424850a4083231b570d4d8.png)
现在将第二张图片剪开拼接在第一张上,衔接处会有明显的不同,这就是图像撕裂。
![](https://i-blog.csdnimg.cn/blog_migrate/9c8634960534bf8c81033c25cdf179a4.png)
当刷新频率与帧率不同时,就会出现这种现象
![](https://i-blog.csdnimg.cn/blog_migrate/9046def2c879e93f7eefd72799877c1a.png)
图像卡在绘制某一帧时使用了内存的一部分,每一个新的帧都会覆盖上一层的帧,从顶端开释,每次输出一行数据。当屏幕刷新时,他不知道缓冲是从什么时候开始的,他从GPU中获取一帧,此时这一帧可能是未完成的帧
双缓存技术
这个问题的解决方案是双缓冲技术,实际上当GPU将一帧绘制到内存,也叫后台缓冲,它会将其复制到内存副区域,也叫帧缓存区。
![](https://i-blog.csdnimg.cn/blog_migrate/a4105b99c891f843c72b94eac75ccb68.png)
当他绘制第二帧时,他会完成后台缓冲,帧缓存区不受影响,当屏幕刷新时,他会从并不处于绘制过程中的帧缓存区进行刷新,这就要用到VSYNC(垂直同步)
![](https://i-blog.csdnimg.cn/blog_migrate/ccb3099d74a9b16d58cd462c12c03c11.png)
垂直同步
VSYNC 避免了在屏幕刷新时,把数据从后台缓冲区复制到帧缓冲区
帧率高于刷新频率是理想的,因为GPU刷新速度高于屏幕读取速度,这种情况下,当屏幕成功刷新后,GPU会垂直同步,等待下一次的屏幕刷新,这种情况下帧频会根据设备刷新频率进行捕捉
![](https://i-blog.csdnimg.cn/blog_migrate/d414c121478101b655a8669e030fb4bc.png)
但是如果屏幕刷新速度比你GPU绘制速度快,每次刷新都会按照同一帧进行。或者说屏幕会显示两次同样的GPU帧
![](https://i-blog.csdnimg.cn/blog_migrate/9520fc8ae4066a32281c0a8b9204c6da.png)
如果帧率高于刷新频率,但是突然下降了,用户就会看见流畅的动画突然出现了卡顿,然后剩余部分还是很流畅,通常称做闪避、打结、延迟或卡顿
![](https://i-blog.csdnimg.cn/blog_migrate/8ff7801c1569682a20614ad0d5c93727.png)
我们的应用应该尽量避免突然地恶化,帧率要一直保证GPU能够迅速获取他要的数据,并且有时间在下一次屏幕刷新前进行绘制。
理解VSYNC仅仅是开始,打造高性能的Android应用提供极致的渲染性能请点击这里