Android显示系统Vsync

来源:互联网 发布:js延迟 onload 编辑:程序博客网 时间:2024/05/08 19:12
Android 显示系统 VSync
FPS

      FPS代表frames per second,中文意思是每秒显示帧数,它描绘了当前系统的绘制更新频率。

      在系统动画过程中,FPS应该尽可能高,否则动画会很卡;如果系统静止,FPS应该很低,否则说明不必要的绘制太多,应该优化。

     CRT显示器必须不断刷新,维持在60Hz到100Hz,否则荧光熄灭,屏幕闪烁。

     LCD则不要求不断刷新,因为它的状态不会随着时间而减弱,相反,LCD强调响应时间,比如说8ms之内应该切换到下一个画面,否则如果动画太快的话,画质模糊。

      VSync 与 Triple Buffering

      VSync代表Vertical Synchronization,中文的意思是垂直同步。它的基本思想是将FPS与显示器的刷新频率通过一个称为VSync的信号同步起来,相当于一个定时中断。

      VSync技术的引入主要是为了解决“Tearing”(撕裂)现象,同时它也顺带节约了电能(因为系统不必满负荷运行)。

      首先,说明一下“Tearing”(撕裂)现象:假设系统的FPS是100,显示器的刷新频率是75Hz,显卡比显示器快1/3;这意味着,在一个刷新周期之内,显卡将写入4/3的帧数据,也就是说,下一帧的1/3覆盖在前一帧之上;当然,随着系统运行,1/3这个比例会发生变化,1/3,2/3,1,1/3,循环;这种帧与帧之间的不完全覆盖重合现象就是“Tearing”(撕裂)现象。

      VSync技术通过一个定期同步信号,同步显卡与显示器,避免显卡过度刷新,从而避免了“Tearing”(撕裂)现象。

      VSync一般依赖于“双缓冲”技术,否则,在FPS低于显示器刷新频率的情况下,仍然会有“Tearing”(撕裂)现象,这个不难理解。

      但是VSync技术也有缺点,如果FPS低于显示器刷新频率,那么系统的FPS将迅速下降为显示器刷新频率的分数倍上,这会导致FPS下降得很厉害,出现“Stutter”(卡顿)现象,因为复杂系统的FPS不可能一直高于显示器刷新频率。“Stutter”(卡顿)现象是指系统忽快忽慢,卡顿非常明显。

      出现这一问题的原因如下:假设显示器的刷新频率是75Hz,FPS为50,显卡比显示器慢1/3;这意味着,在第一个刷新周期之内,显卡只能在后备缓冲区中绘制第一帧的前2/3,在第二个刷新周期内,显卡接着绘制第一帧的后1/3,剩余时间空闲(因为后备缓冲区已满);这样看来,两个刷新周期才能看到一个完整的帧,FPS下降为37.5。

      Triple Buffering(三重缓冲)可以缓解这一问题:假设显示器的刷新频率是75Hz,FPS为50,显卡比显示器慢1/3;这意味着,在第一个刷新周期之内,显卡只能在后备缓冲区中绘制第一帧的前2/3,在第二个刷新周期内,显卡接着绘制第一帧的后1/3,然后绘制第二帧的前2/3,在第三个刷新周期之内,显卡先绘制第二帧的后1/3,然后绘制第三帧的前2/3;这样看来,三个刷新周期可以看到两个完整的帧,FPS仍然为50。

      如果打算对显卡进行基准测试,应该关闭VSync技术,否则会拉低显卡的实际频率。
0 0