如何降低游戏输入延迟?详解各种同步技术

发布于 2024-03-15  101 次阅读


输入延迟,即计算机接受输入(鼠标、键盘、手柄等)至呈现到输出设备(监视器等)经过的时间,该时间受硬件固有延迟、系统性能、设备采样率和刷新率等诸多因素影响。本篇讨论对玩家影响最大的因素:显卡渲染一帧,到该帧从视频端口输出的延迟。如无特殊说明,本篇中的“延迟”均代表该延迟。

说明:在本篇的测试中,游戏均以全屏独占(OpenGL, Direct3D 9,10,11NonFlip)或全屏窗口化(Vulkan, Direct3D 11Flip,12)运行。

垂直同步为何增加延迟

所有FPS游戏优化教程都会建议玩家关闭垂直同步以降低延迟,那么为什么垂直同步会增加延迟?

垂直同步是一种防撕裂技术。通常游戏渲染完成一帧并将该帧放入缓冲区后立即渲染下一帧,游戏渲染每帧的时间不固定,而监视器刷新每帧的时间固定,游戏经常在监视器显示上一帧时将下一帧放入缓冲区,导致监视器呈现的画面一部分是上一帧,一部分是下一帧,造成视觉上的撕裂效果。

垂直同步是防止这种画面撕裂的最简单而有效的方法:在游戏渲染完成一帧并将该帧放入缓冲区后,垂直同步使游戏暂停渲染,直到监视器显示完上一帧。垂直同步阻止游戏在监视器显示上一帧时将下一帧放入缓冲区,因此可以避免画面撕裂。

延迟增加的原因便是垂直同步使游戏暂停渲染:游戏渲染完成一帧,必须等待监视器刷新完,才能输出到监视器。关闭垂直同步,监视器刷新时邻近的帧可以立刻输出到监视器,所以延迟较低。

如果游戏因为卡顿,渲染时间太长,错过了监视器刷新这一帧,则垂直同步会使显示器显示上一帧,直到游戏渲染完成。这导致游戏卡顿时,同一帧会在监视器上显示多次,加重延迟和卡顿。

替代垂直同步的防撕裂技术

三重缓冲

三重缓冲在 D3D9 和 OpenGL 老游戏中较为常见,而新游戏几乎不支持三重缓冲。

三重缓冲允许游戏像关闭垂直同步那样无限制渲染,所以具有较低的延迟。但三重缓冲仅在帧率远高于刷新率时具有较好的效果,若帧率不能维持在刷新率的二倍以上,则动态视觉将非常不连贯。

增强同步/快速同步

增强同步/快速同步由 AMD 和 NVIDIA 显卡驱动提供,且不支持 D3D12 和 Vulkan 游戏。

该技术类似三重缓冲,仅在帧率远高于刷新率时具有较好的效果。帧率达到刷新率的二倍或以上时,显卡驱动自动限制帧率为刷新率的整数倍,改善了三重缓冲的动态视觉不连贯。

可变刷新率/自适应同步

可变刷新率/自适应同步(又称 FreeSync / G-Sync )是真正的颠覆性技术。该技术允许监视器动态改变刷新率,与游戏渲染同步,从而消除延迟和卡顿。近年发布的高刷新率显示器大部分支持该技术。

该技术只允许降低刷新率,而不允许提高刷新率,因此只适用于帧率低于刷新率的情况。帧率等于或高于刷新率时,可变刷新率不工作。

扫描线同步

扫描线同步是民间自创的一种低延迟防撕裂技术,通常由 RTSS 提供,适用于几乎所有游戏,在帧率等于刷新率时效果最好。扫描线同步是对延迟和撕裂的折中,它允许轻微撕裂,换来较低的延迟。

扫描线同步技术预测游戏渲染一帧消耗的时间,并根据预测计算要将游戏渲染延后的时间。假设预测准确,则游戏渲染完成一帧,监视器刚好刷新下一帧,防止画面撕裂的同时延迟较低。

正确配置可变刷新率

要想使用可变刷新率防止撕裂并降低延迟,不仅需要购买支持可变刷新率的显示器,还需要正确配置让可变刷新率正常工作。

硬件

NVIDIA Pascal 及 AMD GCN 2.0 架构显卡开始支持市面上的通用可变刷新率显示器,无论是 G-Sync 还是 FreeSync 。 NVIDIA Maxwell 等老架构显卡仅支持具有 G-Sync 认证的显示器。

可变刷新率要求显示端口至少是 DP 1.4 或 HDMI 2.1 ,常见的 HDMI 2.0 端口不支持可变刷新率。使用 DP 协议的其它接口也支持可变刷新率。

大部分可变刷新率显示器支持帧率指示功能,通过该功能可以确认可变刷新率是否已工作。

软件

游戏必须于全屏或全屏窗口化运行,才能使用可变刷新率技术(即使对于 NVIDIA 显卡)。显卡驱动需要启用可变刷新率功能(默认不启用),且应当将刷新率设置到最高以提供最大可变刷新率范围。

可变刷新率仅在帧率低于刷新率时工作,高于或等于时均不工作,因此最常见的方法是使用 RTSS 或其它帧率限制工具将帧率限制到略低于刷新率,例如 144Hz 显示器可以限制为 140FPS 。推荐使用 RTSS 的原因是它的帧率限制算法更加准确,不精确的帧率会影响可变刷新率的效果。

如下图所示,建议将 Global 配置的 Application detection level 设置为 None 以避免影响所有游戏,然后点击 Add 按钮添加需要限制帧率的游戏,将 Application detection level 设置为 Low 并在 Framerate limit 填写需要限制的帧率值:

若开启可变刷新率并关闭垂直同步,则游戏帧率超出可变刷新率范围时画面撕裂。(延迟优先)大多数游戏不会极端帧率不稳定,若画面仍然经常撕裂,可以进一步降低帧率限制器,预留更多的变化空间。

若可变刷新率与垂直同步同时启用,则游戏帧率不低于刷新率时可变刷新率不工作,但在游戏帧率不稳定导致超出可变刷新率范围时,垂直同步仍能防止画面撕裂。(画面优先)但通常不推荐这种做法。

正确配置扫描线同步

如下图所示,建议将 Global 配置的 Application detection level 设置为 None 以避免影响所有游戏,然后点击 Add 按钮添加需要限制帧率的游戏,将 Application detection level 设置为 Low 并点击左下角的 Setup ,在弹窗中启用 Enable frame color indicator 。

启动游戏并开启全屏,禁用垂直同步,进入游戏而不是停留在菜单。屏幕左侧将快速闪烁,观察闪烁条,不同颜色的交界处即为画面撕裂的位置。在 RTSS Scanline sync 输入 -20 ,此时帧率被限制到刷新率,同时屏幕上仅出现一条撕裂线。以 20 为单位逐渐减小输入的值,如 -20 -40 -60 等,撕裂位置会缓慢移动。不断重复上述过程,直到撕裂位置消失在屏幕边缘。

体验游戏,观察撕裂是否重新出现:若屏幕中间位置偶尔出现撕裂,是游戏短暂帧率不稳定导致,可以忽略。若频繁出现撕裂,且撕裂位置基本固定,则需要重新调整输入值以让撕裂位置尽量接近或消失在屏幕边缘。若撕裂频繁且位置不固定,则说明游戏帧率极其不稳定,需要降低游戏特效,重新调整输入值。

若多个输入值都能防止撕裂,请使用小于 0 但最接近 0 的值。

可变刷新率与扫描线同步同时使用是体验最佳的防撕裂低延迟方案,帧率等于刷新率时,扫描线同步工作,帧率低于刷新率时,可变刷新率工作。如果你因为录屏等原因不方便主动限制游戏帧率(游戏帧率不是录制帧率的整数倍时,录制的视频将出现抖动等不流畅感),强烈建议使用扫描线同步。