查看
通过动态调整帧定时来帮助最小化延迟
(OculusPCSD首次引入的一种帧定时管理技术,它可以通过动态调整帧定时来帮助最小化姿态延迟。现在,PhaseSync(相位同步)已经支持OculusMobileSDK,并已集成到UE4和Unity中。
Quest2比初代Quest拥有更多的CPU和GPU计算量,很多应用可以比计划的更早完成渲染。所以,我们常在Quest2的VrApi日志行中看到更多“earlyframe”。在当前的固定延迟模式下,SDK已经具备了一定的控制延迟能力,例如额外延迟模式/非额外延迟模式设置。但对于开发者来说,它们不够灵活,无法处理动态工作负载,这意味着如果开发者禁用额外延迟模式,而应用所需的时间又比预期长,应用程序就会生成大量staleframe。这会对用户体验产生负面影响,因为它会导致帧抖动。
与固定延迟模式相比,PhaseSync(相位同步)根据应用的工作负载自适应地处理帧定时。目标是在合成器需要完成帧之前完成帧的渲染,这样可以尽可能地节省延迟,同时不会丢失任何帧。对于一个典型的多线程VR应用,PhaseSync(相位同步)和固定延迟模式之间的区别可参见下图说明:
我们可以看到,FrameN的完整时间与PhaseSync(相位同步)下的合成时间非常接近,这是PhaseSync(相位同步)节省延迟的来源。以上只是一个简单说明。
2.1Unity开发者
要在UE4中启用,请通过GitHub下载UE4.25,然后选中ProjectSettings->OculusVR下的“PhaseSync”复选框。
2.2Unity开发者
要在Unity中使用PhaseSync(相位同步),必须使用XRPluginManagement下的OculusXRPlugin。Unity2019.4及更高版本,以及OculusXRPlugin1.7.0支持PhaseSync(相位同步)。你可以选中以下复选框以在Oculus特定设置中启用:
一旦应用成功地启用PhaseSync(相位同步),你可以通过运行“adblogcat-sVrApi”来予以确认。你应该会看到一个标记为“Lat=-1”的组件,这意味着延迟是由PhaseSync(相位同步)动态管理。在固定延迟模式下,非PhaseSync(相位同步)下的值将为“Lat=1”(额外延迟模式)或“Lat=0”(非额外延迟模式)。
你同时可以读取“Prd=?“值,以比较启用阶段同步前后的应用延迟差异。在PhaseSync(相位同步)之下,这个值会更低。
没有开销:PhaseSync没有性能开销,所以它不会以任何显著的方式影响CPU/GPU的使用。 工作负载峰值:PhaseSync有一个保险padding,可以避免将帧过于推向合成时间。但是,如果应用程序的工作负载剧烈波动或峰值很大,则可能会触发比非PhaseSync模式更多的staleframe。 低FPS行为:当一个应用不能达到帧速率时,这将不可避免地触发staleframe。非PhaseSync模式允许这样的情况,但PhaseSync将尝试减少staleframe数,以使至少一些帧在正确的时间显示,因此在这种情况下,你应该能够看到较低的staleframe计数。然而,FPS可能稍低,Prd值可能更高。经验法则是:如果出现staleframe,亦即意味着帧是在错误的时间预测,所以Prd的值就不再重要。 使用Late-Latching:这是另一种降低延迟的技术。Late-Latching能够很好地协同PhaseSync。在一定的范围内,它们是互补的,因为PhaseSync可以在应用程序快速运行时节省更多延迟,而如果应用程序具有高昂的渲染线程,则Late-Latching可以帮助更多。如果同时启用这两个选项,几乎可以保证一定程度的延迟减少。 额外延迟模式:启用阶PhaseSync后,额外延迟模式设置将被忽略。 CPU和GPU:VrApiLogcat中有一个度量称为“CPU&GPU”。在PhaseSync下,系统测量从waitFrame返回(主线程唤醒)到GPU完成,这个值可能大于预期的非PhaseSync模式。 如果在启用所述功能时看到任何异常的应用行为时,请向Oculus提供反馈。