屏幕撕裂和掉帧及其解决方法

丢帧、二级缓存和三级缓存

屏幕撕裂是指显示器在同一个屏幕上显示两个或多个帧。屏幕的更新频率是固定的,通常是60Hz。显卡性能大幅提升,输出帧率可以很高。如果显卡输出高于60fps,两者不同步,画面会撕裂。

GPU渲染-帧缓冲处理-视频控制器-读取帧缓冲信息(位图)-数模转换-逐行显示。当扫描第一帧图像时,GPU获取新数据并将其存储在帧缓冲区中。此时,视频控制器在读取帧缓冲区信息时得到一个新的帧图像,这就造成了撕裂现象。

苹果推出了垂直同步Vsync和双缓冲。

垂直同步Vsync:帧缓冲器被锁定以防止撕裂。

DoubleBuffer:GPU打开了两个缓冲区。

在执行期间,当视频控制器从第一缓存区读取缓存信息时,向其添加锁,并且当渐进扫描完成时,第一缓存区被解锁。并且视频控制器指向第二缓冲器。当第二个缓冲区被锁定并逐行扫描时,第一个缓冲区从GPU获得一个新的数据帧。这样可以解决撕裂问题。

掉帧一般是指由于硬件不足以加载动态显示和显示屏刷新的频率,导致画面停滞(或短时间或长时间)而导致帧率过低的现象。帧数是1秒传输的图片量,也可以理解为图形处理器每秒可以刷新多少次,通常用fps(每秒帧数)来表示。每一帧都是静止图像,通过快速连续显示帧来形成运动的错觉。高帧率可以得到更流畅更真实的动画。每秒帧数(fps)越多,动作显示就越流畅。

为了减少丢帧(注意不解决,丢帧问题只能尽量减少,不解决,丢帧也可能发生在三级缓冲区),引入三级缓冲区,充分利用CPU/GPU的空闲时间,打开ABC的三个帧缓冲区,让A显示屏幕,B渲染好,C从GPU取渲染数据。当屏幕缓冲区和帧缓冲区准备好了,视频控制器就指向帧缓冲区。