垂直同步技术简介

本篇博客对游戏开发中的垂直同步技术进行了简单总结。

基础概念

显示器与帧

  • 显示器是靠连续播放无数张静态画面来达到一个视觉上的错觉,通过人眼的视觉暂留达到动画的效果
  • 每个显示器都有自己的刷新频率
    • 60Hz的显示器一秒钟刷新60张画面
    • 每一张画面都称之为一帧
    • 显示器的刷新率是固定的

显卡的作用

  • 显卡的作用是绘制“帧”,然后把帧发给显示器
  • 显示器收到帧后,开始往显示器上显示

逐行扫描

  • 显示器刷新一帧的时候并不是一次性把整个画面全部刷新出来
  • 而是从上到下一行一行逐渐把图片绘制出来的
  • 扫描分为逐行扫描和隔行扫描
    • 目前大多数显示器采用的都是逐行扫描
    • 60Hz的显示器是指一秒可以逐行扫描 60 次

显示器的前缓存与后缓存

  • 显示器的刷新率是固定的,但是显卡渲染画面(输出帧)是有波动的
  • 由于显卡的性能不变,因此可能会出现简单场景显卡输出帧数高,复杂场景输出帧数低
    • 显卡输出的帧数间隔也可能会不一样(例如前半秒 1 帧,后半秒 59 帧)
  • 一个固定输出的显示器和一个波动的显卡搭配,为了避免冲突,需要添加一个缓存
  • 默认情况下,显示器是有两个缓存的,即前缓存与后缓存
    • 显示器会读取前缓存内的图片,并逐行扫描显示到显示器面板上
    • 显卡会绘制后缓存里的画面,然后显示器绘制完前缓存的画面,就会去读取后缓存里的画面
    • 然后显卡再去绘制前缓存里的画面,即两者交替进行

垂直同步简介

画面撕裂

  • 由于逐行扫描的时间固定,而显卡的刷新不固定,那么显卡的绘图速度可能会超过显示器

  • 上图展示了可能会出现的情况:

    • 显示器还没有显示完前缓冲的画面【1】,还在逐行扫描进行中只画了一半,而显卡已经画好了后缓冲的画面【2】
    • 这时显示器正在画前缓存的画面【画了一半的1】,显卡不会停下来,他画完后缓存【2】会直接过来覆写前缓存【开始往前缓存写3】
    • 此时显示器上半部分是第一帧【半个1】因为还没逐行扫描完,第二帧【2】在后缓存里显示器还没有读取到,而显卡开始往前缓存里写第三帧【3】,那么显示器的下边就会显示第三帧的画面【半个3】
  • 这就是所谓的画面撕裂现象

错帧

  • 对于之前的例子,显示器第一 Hz 的时候,上面有半个 1,下面半个 3,第二 Hz 是个完整的 2,第三 Hz 是完整的3,所以实际上你并没有看见完整的 3 帧,虽然你的电脑显示是 3 fps,但你的肉眼只看见了 2.5 帧,即错帧现象的出现
  • 我们将帧与帧之间的间隔称为帧生成时间
    • 帧生成时间的不平滑也会导致错帧现象的出现,从而引起流畅度的下降
  • 对于显卡刷新率高于显示器(60 Hz)的错帧,一般不会有感觉,而只会有画面撕裂的感觉
    • 真正影响流畅度的是显卡刷新率较低时帧生成时间不平滑引起的错帧现象
  • 因此虽然很多人对于游戏画面流畅的定义是 60 fps,但是因为不能保证显卡输出的帧和显示器刷新率完美契合,那么显卡输出 60 fps实际上是不流畅的,因为你的显示器一直会发生错帧现象,你可能就会看到 50 帧的画面
    • 这就是为什么保证游戏画面流畅的帧数需要高于 60 而不是等于 60

垂直同步的作用

  • 为了避免显卡“抢跑”这种事情发生,垂直同步技术出现了
  • 垂直同步的作用就是强制显卡和显示器同步
    • 如果显示器还在显示前缓冲,显卡画好了后缓冲,那这时候禁止显卡进行绘图,直到显示器把前缓冲的画面显示完整了,显示器跳后缓冲后,才允许显卡去绘制前缓冲
  • 简单理解就是强制显卡的刷新率和显示器刷新率完美契合
    • 如果你是 60 Hz 显示器,开了垂直同步就会被锁 60 了
  • 垂直同步一方面可以解决画面撕裂现象,另一方面也可以解决错帧现象
    • 由于垂直同步的开启,强制每帧间隔完全一样,帧生成时间不平滑的问题也会解决

垂直同步的弊端

  1. 帧数下降
    • 如果显卡性能并不足以保证每秒 60 帧的渲染速度,那么就会出现在一个垂直同步信号周期内,渲染不出一帧画面的情况
    • 那么显卡就会将上一帧画面输出,而延迟1个周期才输出下一帧画面
    • 如果不开垂直同步你的帧数有 50 帧的话,开了垂直同步,可能就会只有 40 帧左右,甚至更少
    • 这个问题可以通过动态垂直同步来解决
  2. 操作延迟
    • 当你发出一个操作指令,在开启垂直同步的状态下,显卡绘制完成后缓冲后,显示器还没显示完前缓冲,显卡只能在这里等着,那么这个指令会和显卡一块在这里等着,直到显示器绘制完成前缓冲,这个画面才会被写入,因此连续的操作就会产生延迟
    • 和帧数下降问题不同,即便你显卡速度很快,能够在开启垂直同步的情况下依然保持 60 fps,这个操作延迟问题也依然存在
    • 这就是为什么不推荐第一人称射击类游戏和 MOBA 游戏打开垂直同步
  • 总结:如果显卡可以保持 60 Hz 及以上的刷新率,那么建议开启垂直同步,否则不建议开启(或开启动态垂直同步)

三重缓冲

  • 默认情况下显示器只有 2 个缓冲区,而打开三重缓冲后,显示器就有了3个缓冲区
  • 这样你的操作指令的滞后会被提前,但是治标不治本,与关闭垂直同步相比,延迟依然会存在。所以打开三重缓冲后,只能缓解操作延迟,但是不能根治

G-sync 与 freesync

  • 既然垂直同步存在操作延迟的问题,那么我们可以想另一个办法来解决画面撕裂和错帧,
  • 这个方法就是让显示器的刷新率也发生波动,即显示器刷新率变频技术
    • 搭载该技术的显示器可以动态调整他们的刷新率而不是固定的1/60秒或者1/144秒扫描完一张画面
    • 显示器会去适应显卡的输出帧,而不是等待显卡
  • 这样的话不仅可以解决画面撕裂,解决错帧,还可以保证几乎没有的操作延迟
  • 当前有两种显示器刷新率变频技术:G-syncfreesync
    • G-sync 技术是 N 卡专用的,你必须要用 N 卡,配合 G-sync 显示器才能激活这项功能
    • Freesync 技术是 A 卡专用,你必须要使用 ATI(AMD)的显卡才能激活这项功能

游戏测试

  • NBA2K19:2070 显卡需开启垂直同步,但不能同时开启动态垂直同步(会有卡顿感)

参考文章