【杂谈】关于垂直同步

前置知识

关于视觉暂留

咱如果上过初中科学,就会知道,人眼看物体时,是光被物体表面反射并刺激了视网膜内的感光细胞,经过视神经把电信号传入大脑,才会产生视觉。

而光对视网膜停止作用时,视神经对光的印象不会立即消失,反而会持续0.1~0.4秒左右的时间。(当然,并不是说视觉暂留“上限10帧”这种愚蠢说法)

PS:或许你正在寻找——走马灯?

关于“帧”

帧其实无需多解释,就是以秒为单位,切换的总画面数,我们称之为“帧数”,那么这一个个画面就成为“帧”(缩写为FPS)

从上文的视觉暂留原理也可以得知,帧数越高,人眼对画面停顿的感知越小,也会认为画面更加流畅。

显示器输出画面原理

你的显示器画面为何撕裂?

监视器的逐行扫描

臭打游戏的都知道,帧由显卡绘制,并输出到显示器。

而显示器实际是从左上角到右下角,一行行进行扫描,最后把画面显示出来。(重置扫描点至左上角的过程我们称为Vblank)

刷新率60Hz就指显示器会在一秒内完成60次全画幅的逐行刷新。

帧缓存

显示器刷新率固定,而显卡肯定会有十分明显的帧数波动,为了让这俩能匹配,我们就设置了一个东西——帧缓存。

如果你没有动过你的帧缓存设置,这里应当会有两个缓存,分别是前缓存(FrontBuffer)和后缓存(BackBuffer)

当显卡绘制出下一帧时,这两个帧缓存位置会“互换”(称为帧传递),即显示器会使用另一个帧来输出图像。当帧缓存刷新速度与显示器刷新率一致时,应当是显示器在显示这个画面时,显卡绘制下一个画面,随后显示器显示下一个画面......循环往复。这时这种情况就不会产生画面撕裂。

帧传递

帧传递(Bufferswap),指前后帧缓存互换的过程。

画面撕裂原因

当显示器显示画面过程中,若显卡已经绘制好了下一个画面,前缓存与后缓存会发生帧传递,这时及时显示器只显示了这个画面的一般(参考上文提到的逐行刷新),它依旧会显示下一帧的画面。这就会导致显卡上下两半像是撕裂了一样。

也就是说,画面撕裂是因为显卡帧率高于显示器刷新率(不过没说一旦高于就会撕裂哈)

垂直同步原理

通用原理

终于开始讲重点了哈。

既然上文说画面撕裂由帧传递时显示器并未逐行扫描完一个帧造成,那么我们是不是只需要让帧传递时间强制与显示器一致就好了呢?

当然是的,垂直同步会强制帧传递只能在显示器完成一次VBlank后进行,这样就防止了二者不匹配的问题。

V-Sync

V-Sync(自适应垂直同步)由Nv推出,主要原理是当显卡性能无法满足垂直同步时,也就是低于垂直同步帧数时,直接关闭垂直同步,高出后再打开。

三重缓冲

这种方法是多增加一个帧缓存,成为“中缓存”,当前缓存被扫描完后,中缓存与前缓存发生帧传递并由后缓存不上位置。

但这种机制中也不难看出,当显示器扫描速度明显低于显卡绘制速度时,前缓存由于没有被扫描,所以后面两个帧缓存无法被使用也无法被增加或更改,这时显卡就空转不干活了。

快速垂直同步

这是在三重缓冲的基础上,不断让中缓存与后缓存发生帧传递,这样当显示器完成一次VBlank后就不会没有较新的中缓存使用了。

G-Sync与FreeSync

这俩的官方叫法依旧是自适应垂直同步。

主要原理是显示器等着显卡而不同于显卡等待显示器。

  • 当显卡绘制速度明显低于显示器刷新速度时,它会强制延长显示器VBlank的时间来等待显卡绘制好下一帧。

  • 当显卡速度接近(略低于)刷新率时,这既不会产生延迟也不会发生撕裂。

  • 当前者高于后者时,无解了直接。

所以不难发现,由于工作逻辑限制,这种显示器等待显卡的方法并不能防止前者绘制速度高于后者刷新率的情况了。

G-Sync与FreeSync的区别

G-Sync需要一颗独立芯片来完成这个自适应的过程,而且需要显示器厂商付费授权。

但FreeSync是免费的且无需独立芯片,理论上只要你的显示器和驱动板支持VBlank自适应,就能使用这项技术。

二者对比

天下肯定没有免费午餐,FreeSync有时(注意,有时!会有鬼影,如图

article-sync-1.jpg

(请自行感受。

不过呢,我并不是A黑。其实G-Sync也同样有着十分大的缺点。例如模块或固件有问题时,管你什么显示器你一个都跑不掉,比如竖线区域跑偏的问题。