Android 三重缓冲

1、系统每隔1/60秒发出VSYNC信号;

2、当绘制系统收到VSYNC信号后,CPU和GPU依次开始对下一帧的数据进行计算;

3、当GPU计算完成,系统在接收到下一个VSYNC信号时,将绘制结果上屏。

当每一帧的处理时间都小于1/60秒时,整个系统都可以保证流畅的绘制。

在上图中,A、B分别代表两个不同的缓冲区,这种系统也就是我们常说的「双缓冲系统」。

在双缓冲系统中的同一个时刻,两个缓冲区会分别处于「显示(Display)」和「待上屏(CPU+GPU+空闲)」两个状态。当处于「待上屏」的缓冲区已经绘制完成,并处于空闲状态,在下一个VSYNC信号到达时会进行缓冲区切换。

双缓冲系统可以有效的避免当绘制速度与屏幕刷新速度不匹配时,新旧画面的一部分同时显示在屏幕上的问题。

然而在双缓冲系统中,如果连续两帧出现处理超时,就会出现下图中的现象:

当第一个VSYNC信号到来时,由于GPU对B缓冲区的操作还没有结束,错过了上屏时机。根据双重缓冲区的特性,虽然CPU已经处于空闲状态,但由于B缓冲区的数据还没有准备好,而A缓冲区的数据正处于显示的过程中,此时已经没有缓冲区可供CPU进行下一帧的计算,这就导致了在前两个VSYNC信号之间,CPU都处于空闲的状态,而GPU也有大部分时间处于空闲。

双缓冲系统在这种情况下,4个VSYNC周期内丢失了两帧。

如果在这种情况下,系统再额外提供一个缓冲区,就可以让CPU在第二个VSYNC信号到来的同时进入工作状态:

在三重缓冲系统中,第一个VSYNC信号到来时,系统发现A、B缓冲区正在使用中,但是CPU此时处于空闲状态。此时,系统会再次分配一个缓冲区C,让CPU立即开始下一帧的计算。

对比双缓冲系统,三重缓冲在这种场景下可以保证让每一个VSYNC信号都触发下一帧的计算,这样即便有两帧的处理时间超过了1/60秒,但仍能避免第二帧的计算超时导致的丢帧,绘制效率提升了25%。

你可能感兴趣的:(Android 三重缓冲)