Oculus Quest开始支持帧定时管理『相位同步』,可大大降低延迟
通过动态调整帧定时来帮助最小化延迟
(映维网 2020年12月08日)Phase Sync(相位同步)是Oculus PC SD首次引入的一种帧定时管理技术,它可以通过动态调整帧定时来帮助最小化姿态延迟。现在,Phase Sync(相位同步)已经支持Oculus Mobile SDK,并已集成到UE4和Unity中。
1. Mobile VR的Phase Sync
与Oculus PC SDK不同,Oculus Mobile SDK从一开始就采用固定延迟模式来管理帧计时。固定延迟模式背后的理念是尽可能早地完成所有工作。它很好地实现了这个目标,但Quest 2比初代Quest拥有更多的CPU和GPU计算量,很多应用可以比计划的更早完成渲染。所以,我们常在Quest2的VrApi日志行中看到更多“early frame”。在当前的固定延迟模式下,SDK已经具备了一定的控制延迟能力,例如额外延迟模式/非额外延迟模式设置。但对于开发者来说,它们不够灵活,无法处理动态工作负载,这意味着如果开发者禁用额外延迟模式,而应用所需的时间又比预期长,应用程序就会生成大量stale frame。这会对用户体验产生负面影响,因为它会导致帧抖动。
与固定延迟模式相比,Phase Sync(相位同步)根据应用的工作负载自适应地处理帧定时。目标是在合成器需要完成帧之前完成帧的渲染,这样可以尽可能地节省延迟,同时不会丢失任何帧。对于一个典型的多线程VR应用,Phase Sync(相位同步)和固定延迟模式之间的区别可参见下图说明:
我们可以看到,Frame N的完整时间与Phase Sync(相位同步)下的合成时间非常接近,这是Phase Sync(相位同步)节省延迟的来源。以上只是一个简单说明。
2. 如何为Quest/Quest 2启用Phase Sync(相位同步)
开发者可以将V23 Mobile SDK作为opt-in功能,Oculus同时将它集成到最新的UE4和Unity版本中。
2.1 Unity开发者
要在UE4中启用,请通过GitHub下载UE4.25,然后选中Project Settings->OculusVR下的“Phase Sync”复选框。
2.2 Unity开发者
要在Unity中使用Phase Sync(相位同步),必须使用XR Plugin Management下的Oculus XR Plugin。Unity 2019.4及更高版本,以及Oculus XR Plugin1.7.0支持Phase Sync(相位同步)。你可以选中以下复选框以在Oculus特定设置中启用:
一旦应用成功地启用Phase Sync(相位同步),你可以通过运行“adb logcat-s VrApi”来予以确认。你应该会看到一个标记为“Lat=-1”的组件,这意味着延迟是由Phase Sync(相位同步)动态管理。在固定延迟模式下,非Phase Sync(相位同步)下的值将为“Lat=1”(额外延迟模式)或“Lat=0”(非额外延迟模式)。
你同时可以读取“Prd=?“值,以比较启用阶段同步前后的应用延迟差异。在Phase Sync(相位同步)之下,这个值会更低。
2.3 原生开发者
Oculus没有计划在VrApi中为这个功能发布一个公共API。相反,Phase Sync(相位同步)在OpenXR实现中将是默认的Vr Timing管理方法。由于已经推出了正式的OpenXR支持,Oculus鼓励原生开发者测试所述功能。
3. 影响和考量
Oculus已经为数个Oculus应用程序启用了Phase Sync(相位同步),并表示延迟节省量相当可观。例如对于Oculus Home,Quest 2减少了10毫秒的延迟,Quest 1减少了8毫秒的延迟。
Oculus鼓励每个开发中的应用程序启用所述功能,特别是如果你的应用程序对延迟敏感(如使用手部追踪)。下面是额外的提示说明:
-
没有开销:Phase Sync没有性能开销,所以它不会以任何显著的方式影响CPU/GPU的使用。
-
工作负载峰值:Phase Sync有一个保险padding,可以避免将帧过于推向合成时间。但是,如果应用程序的工作负载剧烈波动或峰值很大,则可能会触发比非Phase Sync模式更多的stale frame。
-
低FPS行为:当一个应用不能达到帧速率时,这将不可避免地触发stale frame。非Phase Sync模式允许这样的情况,但Phase Sync将尝试减少stale frame数,以使至少一些帧在正确的时间显示,因此在这种情况下,你应该能够看到较低的stale frame计数。然而,FPS可能稍低,Prd值可能更高。经验法则是:如果出现stale frame,亦即意味着帧是在错误的时间预测,所以Prd的值就不再重要。
-
使用Late-Latching:这是另一种降低延迟的技术。Late-Latching能够很好地协同Phase Sync。在一定的范围内,它们是互补的,因为Phase Sync可以在应用程序快速运行时节省更多延迟,而如果应用程序具有高昂的渲染线程,则Late-Latching可以帮助更多。如果同时启用这两个选项,几乎可以保证一定程度的延迟减少。
-
额外延迟模式:启用阶Phase Sync后,额外延迟模式设置将被忽略。
-
CPU和GPU:VrApi Logcat中有一个度量称为“CPU&GPU”。在Phase Sync下,系统测量从waitFrame返回(主线程唤醒)到GPU完成,这个值可能大于预期的非Phase Sync模式。
如果在启用所述功能时看到任何异常的应用行为时,请向Oculus提供反馈。