低延迟框架同步

改变线程同步方式以大幅降低输入延迟。

Windows
MacOS
Linux

我们提前发布本内容的测试版以便于你启动和运行。后续更新将很快发布,敬请关注!

低延迟帧同步模式会修改游戏、渲染及RHI线程和GPU之间线程同步的执行方式,以显著减少和控制输入延迟。在之前的引擎发行版中,游戏线程在帧结束时与渲染线程同步。当启用 r.OneFrameThreadLag CVar(默认情况下启用)时,这种同步方式可确保游戏线程不会比渲染线程提前一整帧以上。 

特定于平台的显卡驱动程序通常会暂停调用Present()的线程,以防止游戏的运行速度比帧的显示速度快。驱动程序允许交换链得到填充,并且在空间不足时暂停调用线程。在UE4的并行渲染引入之前,该渲染行为是正确的,因为游戏线程会等待渲染线程,而渲染线程会被显卡驱动程序/操作系统暂停。

但是,伴随着并行渲染的引入,Present()现在由RHI线程调用,因此驱动程序现在会调节该线程。游戏线程仍然仅与渲染线程同步,这将使这两种线程同以前相比大大提前于GPU和翻转帧。在 rhi.SyncInterval 设置为2、刷新率为30hz的游戏中,这将导致最高达130 ms的输入延迟。

要实现与UE4采用并行渲染之前相同的输入延迟,需要将游戏线程改为与RHI线程同步。但是,还有一种更好的方式。启用垂直同步时,交换链提供规律、可预测的同步间隔,即,交换链翻转前台/后台缓冲区的时间点。通过将游戏线程帧的开头与相对于垂直同步的任意点同步,可以准确地控制输入延迟。通过谨慎选择该点,我们可以在输入延迟和性能之间进行抉择。 

该新低延迟帧同步模式添加了一种称为 r.GTSyncType(游戏线程同步线程)的新CVar。此CVar驱动此新帧同步机制的工作方式。它允许以下值:

说明

0

游戏线程与渲染线程同步(旧行为,默认)。

1

游戏线程与RHI线程同步(相当于采用并行渲染前的UE4)

2

游戏线程与交换链同步,显示+/-以毫秒为单位表示的偏移。

为实现模式2同步,引擎通过调用Present()时传入驱动程序的索引跟踪显示的帧。此索引是从平台帧翻转统计数据检索的,它指示每帧翻转的精确时间。我们使用这些值来预测下一帧应于何时翻转,然后基于该时间启动下一个游戏线程帧。

CVar rhi.SyncSlackMS 决定应用到预测的下一次垂直同步时间的偏移。减小该值将缩小输入延迟,但是会缩短引擎管道,更容易出现由卡顿造成的掉帧。相似地,增大该值会延长该引擎管道,赋予游戏更多应对卡顿的弹性,但是会增大输入延迟。

一般来说,使用这个新的帧同步系统的游戏应在维持可接受帧率的情况下尽可能缩小 rhi.SyncSlackMS

例如,更新率为30hz的游戏具有以下CVar设置:

  • rhi.SyncInterval 2

  • r.GTSyncType 2

  • r.OneFrameThreadLag 1

  • r.Vsync 1

  • rhi.SyncSlackMS 0

它将拥有的最佳输入延迟为~66ms(两个30hz帧)。如果将 rhi.SyncSlackMS 增大至10,则最佳输入延迟为~76ms。

r.GTSyncType 2 也适用于更新率为60hz的游戏(即,rhi.SyncInterval 设置为1),但是采用此设置的好处不易察觉,由于与30hz相比,帧率为两倍,输入延迟会降低一半。

在不受支持的平台上,r.GTSyncType 2 将会退回到模式1。

Select Skin
Light
Dark

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见