模拟是将鼠标输入应用于游戏状态的阶段。渲染提交– 随着模拟确定清楚在下一帧中的哪个地方放置相关项,它将开始向图形 API 运行时发送渲染作业。该运行时接着将渲染命令传递给图形驱动。图形驱动– 图形驱动负责与 GPU 通信并向其发送命令分组。根据图形 API 的不同,驱动可能会为开发者进行此分组,或者开发者可能要负责对渲染作业进行分组。渲染队列– 在驱动提交要让 GPU 执行的作业后,该作业会进入渲染队列。渲染队列的目的是:通过使缓冲区内始终放有需要 GPU 执行的作业,不断向 GPU 提供作业。这有助于更大限度提高 FPS(吞吐量),但可能会带来延迟。渲染– GPU 渲染与单个帧相关的所有作业所需的时间。合成– 根据显示模式(全屏、无边框、窗口化)的不同,操作系统中的桌面窗口管理器 (DWM) 必须提交另一些渲染作业,以合成特定帧的其余桌面部分。这可能会增加延迟。建议始终处于独占全屏模式,以更大限度地减小合成延迟!扫描输出– 合成完成后,最终的帧缓存就已经为显示做好了准备。GPU会指示帧缓存已经可以被显示并更换要读取的帧缓存,以便进行扫描输出。如果启用了垂直同步,帧缓存中的这一“翻转”操作将因为必须等待显示器的垂直同步信号而暂停。准备就绪后,GPU 会根据显示器的刷新率 (Hz),逐行将下一帧画面送入显示器。鉴于扫描输出是刷新率函数,我们将其包含在“显示延迟”中。显示处理– 显示处理是指显示器处理传入帧(扫描线)和发起像素响应所需的时间。像素响应– 这是指像素从一种颜色变为下一种颜色所需的时间。由于像素是真正的液晶,因此需要时间进行更改。像素响应时间可能取决于所需更改的强度,也将取决于面板技术。
受GPU 限制的延迟管线
现在我们已了解点击操作是如何传入屏幕的,接下来让我们深入了解一下性能。分析游戏时,我们通常会尝试将性能定性为受 GPU 或CPU 限制。这对于了解系统性能非常有帮助,但在现实世界中,游戏通常会在这两种状态中来回切换。
让我们从垂直同步关闭时,受GPU 限制的情况入手。
在此示例中,我们将管线简化为 5 个主要阶段:外设、CPU、渲染队列、GPU 和显示器。
我们来检查第 4 帧,并查看每个阶段的进展情况:
外设– 鼠标输入或键盘输入可以随时启动;具体取决于用户。在此示例中,由于在 CPU 准备好接受输入之前鼠标便被点击,因此输入事件只能等待。这就像到达火车站后,等待下一辆火车一样。CPU– CPU(模拟)通常在所谓的呈现块结束之后开始启动。在受 GPU 限制的情况下,CPU 会更快地执行作业,这表示它可以先于 GPU 运行。但是,在大多数图形 API(DX11、DX12、Vulkan 等)中,CPU 渲染提交线程可以提前运行的帧数有限。在上述情况下,可以让 CPU 提前运行两帧。当驱动向 GPU 提交完作业后,CPU 阶段便会结束。实际上,渲染队列存在重叠,但我们将在后面进行讨论。渲染队列– 不妨像其他队列一样思考该队列。先进先出,第一个进入的队列就是第一个出来的队列。如果当 CPU 提交更多作业时,GPU 还在处理上一帧,则CPU 会将渲染作业放入渲染队列中。此队列有助于确保 GPU 不断获得馈送,并帮助平滑帧时间,但这会增加大量延迟。GPU– 这是帧的实际 GPU 渲染。在受 GPU 限制的情况下,作业一个接一个进行,因为 GPU 是瓶颈部分。显示– 在此阶段,垂直同步处于关闭状态。当GPU 完成渲染后,它会立即扫描新缓冲区,而不管显示器处在扫描流程中的哪个阶段。这会导致画面撕裂,但因为它可提供更低的延迟,所以经常受到玩家的青睐。未来我们还将发布有关垂直同步和 G-SYNC 的文章,敬请关注。
好的,现在我们了解了本部分涉及哪些内容,我们可以发现我们因 GPU 瓶颈而停滞,从而导致渲染队列堆积,并导致 CPU 提前运行。在上图中,我们可以看出我们的帧时间是指测量 FPS 的方式。在这种情况下,更快的 GPU 会产生更高的帧率。
此外,我们还可以看到从首次点击鼠标到显示阶段完成的系统延迟。在受 GPU 限制的情况下,由于渲染队列的原因,延迟通常较高,并且游戏先于呈现块运行,并生成会在提交时延迟的新帧
NVIDIA Reflex SDK 延迟管线
下面,我们来看看 NVIDIA Reflex SDK 对受 GPU 限制的管线的影响:
正如您所看到的,渲染队列几乎消失。不过,Reflex SDK 不会禁用它,而只是将其清空。但这是如何运作的呢?
从本质上说,游戏可以更好地控制 CPU 的运行速度,使其无法提前运行。此外,它允许及时向 GPU 提交作业,让GPU 能够在作业管线中无任何空闲间隙的情况下处理作业。而且,通过将 CPU 作业开始时间略微延后,它为尽可能采样到最后一毫秒的输入创造了机会,从而进一步降低了延迟。
此外,在通过 SDK 采用的方法减少渲染队列中的作业时,游戏延迟也会开始降低。这源自于在 GPU 受限的场景中由渲染队列带来的背压降低。
对于先前已经针对延迟实施了优化的用户来说,这就像是使用优秀的游戏中帧率限制工具来减少延迟一样。优秀的游戏中帧率限制工具会使游戏在合理的位置停止,从而降低延迟和 CPU 反压。
但是,使用 NVIDIA Reflex,您不必将帧率锁定为固定值,而是可以按照超越限制的速度运行,从而进一步降低延迟。您可以将其视为一种“动态”帧率限制工具,能始终为您保证最理想的延迟。
受CPU 限制的延迟管线
在受 GPU 限制的情况下使用 Reflex 低延迟模式时,即使 GPU 保持工作量完全饱和并且得到充分利用,管线的行为也会表现得如同受 CPU 限制一样。让我们看看受 CPU 限制的实际管线是怎样的。
正如您在此图表中所看到的,帧率受 CPU 限制。由于 CPU 无法在 GPU 之前运行,因此在本例中并没有渲染队列。通常,与受 GPU 限制的情况相比,受CPU 限制时的延迟较低。
在这种情况下,速度更快的 GPU 并不能提高 FPS,但可以降低您的延迟。关闭垂直同步或启用 G-SYNC 时,速度更快的 GPU 意味着可以更快地将经渲染的图像发送到显示器。
您或许也曾好奇,为什么在调低设置后,游戏的响应速度似乎加快了,这就是原因所在。调低设置往往会形成受 CPU 限制的情景(消除队列),同时缩短 GPU 渲染时间,从而进一步降低延迟。
借助 Reflex 低延迟模式,游戏玩家无需再将调低设置作为一种默认做法。由于我们可以有效地缩短渲染队列,因此额外的渲染作业只会延长 GPU 渲染时间。
此外,即使您受 CPU 限制,Reflex 低延迟模式还具有“加速”设置,该设置会禁用省电功能,从而略微减少延迟。在受 CPU 限制、GPU 利用率较低的情况下,GPU 时钟将保持较高频率以加快处理速度,从而可以将帧尽快传递到显示器。通常,这种加速设置能带来的好处并不大,但有助于尽可能降低管线中每一毫秒的延迟。
深入探究 PC 延迟和重叠
准备好更深入地探究了吗?我们来观察一个帧,不过这次要观察拥有完全重叠的管线。
如您所见,大多数重叠发生在模拟和 GPU 渲染完成之间的 PC 延迟核心部分。为什么会出现这种情况呢?
帧通过称为 drawcall 的小作业进行渲染。这些调用最终会分组到作业包中。随后,作业包会被显卡驱动发送到 GPU 进行渲染。这样一来,每个阶段都会在上一阶段完成之前开始工作,从而将帧分成多个小块。
作业通过管线完成处理,最终写入帧缓冲区。这种操作会一直持续,直至帧完全渲染。渲染完成后,后置缓冲区会与交换链中的另一个可用缓冲区交换,并发送以进行扫描。
在研究渲染延迟和游戏延迟时,了解这一点非常重要。通常,游戏延迟和渲染延迟会彼此重叠,这意味着简单的相加没法得出正确的总延迟。

总结

系统延迟既是游戏体验的定量衡量指标,也是影响游戏玩家在第一人称射击游戏中瞄准精度的关键要素。NVIDIA Reflex 让开发者和玩家能够针对系统延迟进行优化,并率先使之轻松地测量系统延迟。
总之,NVIDIA Reflex 提供了一整套延迟技术:
低延迟技术:NVIDIA Reflex SDK– 开发者 SDK,用于启用 NVIDIA Reflex 低延迟模式,从而在 GPU 密集型场景中降低延迟延迟优化的驱动控制面板设置– 增强的“首选最高性能”模式和“超低延迟”模式GeForce Experience 性能优化– 一键式 GPU 超频自动优化工具延迟测量工具:NVIDIA Reflex SDK 指标– 游戏和渲染延迟标记使开发者能够在游戏中显示延迟指标NVIDIA Reflex 延迟分析器– 360Hz G-SYNC 显示器的新功能率先实现了完整的端到端的系统延迟测量GeForce Experience 性能监控– 提供侧栏和游戏中叠加显示,可显示包括延迟在内的实时性能指标
我们非常高兴地推出 NVIDIA Reflex,帮助您获得响应更加迅捷的游戏体验。在NVIDIA,我们高度专注降低延迟,并将会继续不断完善NVIDIA Reflex,发展壮大我们的合作伙伴生态系统。
我们很乐意听取您的反馈意见!请访问 Reflex 社区论坛,探讨延迟相关话题,或者提出有关 NVIDIA Reflex 平台的问题。
9 月17 日发布的 Game Ready 驱动将提供对 NVIDIA Reflex 低延迟模式的驱动支持,也有多家合作伙伴将在今年不同时间为其游戏作品增加相关游戏支持。从今年秋季起,宏碁、华硕、戴尔和 MSI 将推出360Hz G-SYNC 游戏显示器。