为什么是VSYNC
单缓冲区
显示器刷新的频率决定了人肉眼可感受的流畅度,刷新频率太低会导致出现PPT效果,刷新频率太高又没有太高的必要,所以显示器一般的刷新频率为60Hz,人眼可感知的最低限度,即1秒刷新60帧,也就是显示器会1秒从显卡中读取66帧的数据显示到屏幕上,那么这些数据是从哪里来的呢?
答案是CPU/GPU产生的,也就是CPU/GPU作为帧的生产者,显示器作为帧的消费者
CPU/GPU除了要承载显示帧的绘制工作,还需要承担其他的任务,所以频率都要比显示器高很多。那么这就产生了一个问题,CPU/GPU和显示器的频率不一致,导致刷新不同步
以上的描述,都是在单缓冲区的情况下,也就是CPU/GPU和显示器公用一个缓冲区,可想而知,因为刷新不一致,显示器在从缓冲区读数据的时候,可能CPU/GPU刚刚写了一半数据,导致显示器显示一个割裂的页面。
双缓冲区
为了解决这个问题,引入双缓冲区,一个用于CPU/GPU产生数据,一个用于显示器读取数据,在合适的时机,交换两个缓冲区,这样就不会造成显示画面的割裂了,那么什么时间是最合适的呢?
我们知道显卡扫描屏幕是从第一行到最后一行的,扫描完毕又会回到第一行开始下一个周期,那么结束一个扫描周期到下一个扫描周期开始的这段空闲时间就是最佳的交换时间。
在这种情况下,画面割裂的问题得到了有效的解决,但是还会有一种问题:
我们知道在一帧显示之前,CPU会处理应用程序的数据,然后将结果交给GPU(为什么要用到GPU,在另一篇文章中讲到)继续处理,最后合成帧(真实情况还会有HardwareComposer)
而我们之前提到过,人眼可感知的最低帧率为60Hz,也就是16ms要显示一帧,而CPU又是一个大忙人,如果CPU忙于其他事情没有来得及处理数据,那么就会造成下一帧合成缓慢,显示器迫不得已继续使用之前的帧,这样就会导致画面卡顿
VSYNC
为了解决上面的问题,我们又引入一个新的概念,VSync中断,Vsync是VerticalSynchronization的缩写,简单的可以理解为屏幕的一个刷新周期,也就是说我们进行了一个屏幕刷新周期之后,立马通知CPU该去绘制下一帧的数据了,这样才能在下一个中断来临之前确保有新的数据可以用
如果只是了解VSYNC我们到这里就可以了,但是是google还在此基础上做了更深的优化
拓展阅读:google的trriple buffer