撕裂的原因
屏幕撕裂撕裂(ScreenTearing)是指显示器把两个或更多的影格(frame)显示在同一画面上。屏幕的更新频率是固定的,通常是60Hz。显卡效能大幅提高,输出的帧率可以非常高,如果显卡的输出高于60fps,两者不同步,画面便会撕裂。
GPU进行渲染-帧缓存处理-视频控制器-读取帧缓存信息(位图)-数模转换-逐行显示。当第一帧图像在扫描过程中,GPU拿到新的数据并存储到帧缓存区,这时视频控制器读取帧缓存信息时拿到了新的一帧的图像,这样就造成了撕裂现象。
撕裂解决办法:
苹果推出了垂直同步Vsync和双缓存区。
垂直同步Vsync:帧缓存区加锁,防止出现撕裂情况
双缓存区DoubleBuffer:GPU开辟出两个缓存区
执行的时候,当视频控制器从第一个缓存区读取缓存信息时,给它加上一把锁,当逐行扫描完成时,第一个缓存区解锁。并且视频控制器指向第二个缓存区,当第二个缓存区加锁并且逐行扫描时,第一个缓存区拿到GPU传过来的新的一帧数据。这样能够解决撕裂问题。
掉帧:
掉帧一般是指由于硬件不足以负荷显示器画面动态显示刷新的频率,从而帧率过低所造成的画面出现停滞(或短时间或长时间)现象。帧数就是在1秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。
为了减少掉帧(注意不是解决,掉帧问题只能尽量的减少,而不是解决,三级缓冲区也有可能出现掉帧),引入三级缓存区,三级缓冲区是为了充分利用CPU/GPU的空余时间,开辟ABC三个帧缓冲区,A显示屏幕, B也渲染好,C再从GPU拿取渲染数据,当屏幕缓冲区和帧缓冲区都弄好了,然后视频控制器再指向帧缓冲区的另外一个,再显示,这样交替,达到减少掉帧的情况。
网友评论