启用延后锁定
更新时间: 2024年12月16日
注意:在 Unreal 引擎 4 中,延后锁定不应与
遮挡查询同时启用。在 Unreal 引擎 5 中,延后锁定不应与
模拟统一缓冲区同时启用。
延后锁定是一种延迟减少技术,它可让应用程序在头部和控制器姿态中移除最多一个额外的延迟帧。最新的 Meta XR 插件为 Meta Quest、Quest 2 和 Quest 3 应用提供了这个选项。
延后锁定通过在渲染开始前的最后一刻向 GPU 提供相机和控制器姿态,帮助 Meta Quest、Quest 2 和 Quest 3 应用降低其相机和控制器变换中的移动到光子延迟。
在大多数游戏引擎中,包括 Unity 和 Unreal,从接收输入,到在屏幕上显示该输入的效果,二者之间最多有 3-4 帧的延迟:
- 当前输入状态是在主线程开始更新时采样的。主线程对当前输入状态采取操作并更新游戏模拟。几乎所有 C# 脚本都会在这个模拟阶段运行。
- 主线程完成后,渲染线程在 CPU 上启动,确定要向 GPU 发送的命令,以生成游戏模拟的视觉呈现。
- 渲染线程完成后,系统会向 GPU 发送命令清单,它会为您的屏幕生成眼睛缓冲帧。
启用延后锁定的话,游戏引擎将做两件事:
- 在可能的最后时刻(渲染线程结束时)对头戴设备和控制器位置采样,此时它会向 GPU 发送命令清单。
- 根据从头部或控制器姿态获得的每个统一缓冲区值的这些数据计算新姿态,并在渲染线程结束时将其写入到统一缓冲区内存中。
例如,假设有一个应用有 200 个对象。在这些对象中,10 个是您右手网格的子对象(在场景层级结构中),10 个是您左手网格的子对象,其他 180 个对象正常存在于场景中。执行延后锁定时,我们将重新计算:
- 左手和右手锚点的这 20 个子对象,每个对象的模型矩阵。
- 代表相机位置的新的全局视图投射矩阵。
然后系统会在新矩阵值中打补丁。打补丁就像重新写入到相同的 Vulkan 统一缓冲区内存中一样简单,与之前在帧中发生的正常写入操作方式完全相同。这些写入操作在执行常规渲染线程期间发生。延后锁定写入操作在渲染线程结束时发生,此时有新的姿态数据。
实现这种延后锁定时,要注意两个考虑因素:
- 延后锁定可让 GPU 使用系统尚未通过游戏代码解析的头戴设备位置来渲染帧。此功能可让玩家在某一帧将头或手穿过墙壁,即使游戏代码阻止这些碰撞,也会发生这种情况。理解这一点的关键是,上图中的 Gameplay Pose(游戏姿态)是场景中最早的,系统用它计算您的物理属性和游戏玩法。系统使用更新的姿态数据来计算 Late Latching(延后锁定)姿态要晚得多。
- 从主线程和渲染线程的角度来看,在以 72fps 运行的应用中,不保证一“帧”是 1/72 秒。如果启用了相位同步,并且您的应用较为简单,它在主线程上耗时 1ms,在渲染线程上耗时 3ms,Unity 和 Unreal 将会自动安排渲染线程在需要渲染 GPU 帧之前的 3ms 开始,主线程在需要渲染 GPU 帧之前的 1ms 开始。因此,在这些条件下,延后锁定只会减少 4ms 的延迟。
延后锁定和
相位同步通常是互补的,我们建议开发者同时使用这两种系统。
要使用延后锁定功能,您必须启用
多视野并使用 Vulkan API。
要启用延后锁定
- 下载并安装 Meta XR 插件。
- 启用 Meta XR 插件。
- 点击编辑 > 插件 > 虚拟现实。
- 选中 Meta XR 插件,在项目中启用它。
- 点击编辑 > 项目设置。
前往插件 > Meta XR > 移动 > 延后锁定,选中复选框来启用此功能。
在应用中启用延后锁定后,您可以通过检查 logcat 日志来验证它是否已经激活,并查看该功能减少的延迟量。
Prd 值代表预测延迟,并指示由运行时衡量渲染延迟。要计算启用延后锁定后减少的延迟量,请比较延后锁定处于活动状态和非活动状态时的 Prd 值。例如,如果启用延后锁定时的 Prd 值是 35ms,未启用延后锁定时的 Prd 值是 45ms,启用延后锁定就减少了 10ms 的延迟。