XR 优化
理解 VR/AR 的性能预算与单 Pass Stereo、注视点渲染等 XR 特有优化手段。
学习目标
- 能解释 PC VR 90 FPS 与 Standalone 72 FPS 对应的毫秒级帧预算,以及双眼渲染对 GPU Fill 的放大效应
- 能说出 Single Pass Instanced 相对 Multi-Pass 减少哪一类 CPU/GPU 成本,以及 URP Renderer 中应如何启用
- 能回答:Standalone 头显 GPU ms 顶满但 CPU 有余量——你会先调 Render Scale、FFR 还是检查是否仍在 Multi-Pass?
原书边界:Chapter 7
Packt 第三版把本章命名为 Optimizations for Virtual and Augmented Reality。官方目录列出的核心范围如下;这些条目共同构成本章的一对一边界:
- Overview of XR technology:纳入本章实验与验收,不拆到别章重复计数。
- Developing XR products:纳入本章实验与验收,不拆到别章重复计数。
- Performance enhancements in XR:纳入本章实验与验收,不拆到别章重复计数。
XR 把双眼渲染、显示刷新、姿态预测、合成与 motion-to-photon 约束叠到普通帧预算之上。OpenXR 与 XR Plug-in Management 取代旧 SDK 接入,但单/多 Pass、分辨率、注视点、重投影和设备热预算仍是核心。 因此,本章既保留 2019/2020 语境,也明确标出迁移到现代 Unity 时哪些是稳定原理、哪些只是版本相关接口。
头显里多掉一帧,人就会晕
桌面游戏掉帧只是卡顿;在 VR 里,帧率不足或帧时间抖动 会直接触发 晕动症——画面与内耳前庭不同步。Quest、Index 等设备要求 72 甚至 90 FPS 稳定提交,整帧预算只有 约 11–14 ms,比 60 FPS 桌面(16.6 ms)更紧。
更麻烦的是 双眼:同一场景往往要 画两遍(或使用 Single Pass 一次提交双眼),像素量接近 2× 分辨率 × 2 眼。Ch6 的 GPU 优化在 XR 里全部 乘上系数——这章专门讲 XR 特有的性能预算与渲染路径。
像双筒望远镜:两只眼睛各要一张清晰底片
想象用 双筒望远镜 同时看 3D 场景:每只目镜都要 独立对焦、独立曝光。若摄影师(引擎)对左筒拍一张、再跑回原点给右筒拍一张(Multi-Pass),快门与布景时间翻倍;若一次按下双快门、镜头阵列同时曝光(Single Pass Instanced),场地周转快一倍。
周边视觉其实 看不清细节——只在 注视中心 用高分辨率底片、外围用粗颗粒(Foveated Rendering),是 XR 里常用的 「省胶片」 手段。
XR 性能预算:90 FPS 与 72 FPS
↡扩展现实设备为维持沉浸与舒适所要求的最低稳定帧率及对应帧时间上限。 由头显刷新率决定,不是「能跑 60 就行」。
PC VR(Link、Index 等)常见 90 FPS ≈ 11.1 ms/帧。Standalone(Quest 2/3)基线 72 FPS ≈ 13.9 ms,热节流或省电档可能更低。
高刷头显(120 FPS)预算约 8.3 ms,留给后处理与 Overdraw 的空间更小。
除渲染外,预算还要分给 姿态预测、合成、重投影(Asynchronous Spacewarp / Application SpaceWarp)。Profiler 里 GPU ms + XR 模块 接近预算线时,任何 全屏 Post、高 MSAA、未合批透明 都会先爆。
Single Pass Instanced:一次 Draw 画双眼
↡GPU 实例化路径下一次 Draw Call 通过 SV_InstanceID / unity_StereoEyeIndex 同时为左右眼输出,避免场景遍历两遍。 是 URP/HDRP XR 的 推荐立体渲染模式。Legacy Multi-Pass 对每物体 提交两次,CPU 与驱动 SetPass 接近翻倍。
启用与 Shader 注意点
- Project Settings → XR Plug-in Management:安装目标平台 Plug-in(OpenXR、Oculus 等)
- URP Renderer Data:Stereo Rendering Mode 选 Single Pass Instanced(或 Multiview,视平台)
- 自定义 Shader 必须用 XR 兼容宏(
UNITY_VERTEX_OUTPUT_STEREO、unity_StereoEyeIndex),Post Processing 需验证 双眼均正确 - Fullscreen Pass、Grab Pass、部分后处理 在 XR 下易踩坑——Frame Debugger 分别检查 Left/Right eye
Foveated Rendering:中心清晰、周边省像素
↡根据视线或固定视场中心,对视网膜周边区域降低 shading 分辨率或采样率,以换 Fill rate。 利用 人眼周边分辨率低。Standalone 常用 Fixed Foveated Rendering (FFR);带眼动追踪的设备可做 Gaze-contingent 动态注视点。
关闭 FFR 时 全屏均匀采样,Fill rate 最高,边缘最稳。
中等 FFR:中心 1×、中环降采样、外环更粗——多数 Quest 项目的平衡点。
激进 FFR:GPU 省最多,但周边 模糊/游泳(shimmer) 明显,快速转头时更易察觉。
XR 输入开销与 URP XR 设置
↡XR Input Subsystem 每帧轮询 HMD、控制器与手部追踪姿态,以及射线/UI 交互产生的 CPU 成本。 与渲染 共享同一帧 CPU 预算。大量 Physics.Raycast、XR Interaction Toolkit hover/select、Hand 骨骼 会在 PlayerLoop 早期 抬 CPU ms。
↡Unity URP 与 XR Plug-in 在 Project Settings 与 Renderer Asset 中的立体渲染、MSAA、Render Scale 等成组配置。 决定 GPU 路径是否正确、是否启用 Single Pass、MSAA 样本数 等。
常见配置清单:
- Edit → Project Settings → XR Plug-in Management:勾选目标 Loader;Android 与 Standalone 分开配置
- URP Asset:MSAA 与 Render Scale(如 0.9–1.1);过高 MSAA 在 XR ×2 眼 极贵
- Quality Level:Standalone 单独一档,关 多余 Post、阴影距离、像素灯数量
- Input System:用 XR Input Actions 替代每帧
Input.GetButton散落调用;交互集中在一个 Input Reader 里更新
动手:Standalone VR 性能排查
下面五步针对 Quest 类 Standalone GPU/CPU 双紧场景。每步示意图对应当前检查点——建议 Link 或实机 + Meta XR Profiler 同步。
猜一猜:把 FFR 从 Off 调到 High,GPU ms 下降但边缘发糊,该优先降 FFR 还是降 Render Scale?
① 基线:确认目标 FPS 与帧预算
确认 Quality 目标 72/90 FPS。Profiler 记录 CPU ms、GPU ms、XR Wait/Get Pose。超 13.9 ms(72 FPS)即需优化;记录是 GPU bound 还是 CPU bound。
容易踩的坑
小结
- XR 预算由刷新率决定:90 FPS ≈ 11.1 ms,72 FPS ≈ 13.9 ms,需留合成余量
- 双眼放大像素与 Draw;Single Pass Instanced 是 URP 默认高效立体路径
- Foveated Rendering 用周边降采样换 GPU;等级与 Render Scale 需实机权衡伪影
- XR 输入每帧 Poll + 射线交互占 CPU;与 URP XR 设置(MSAA、Render Scale、Post)同帧竞争
- 排查顺序:预算 → Single Pass → FFR/Scale → URP 画质档 → 输入 CPU
练习
问题 1(改 Demo 型) 在 Standalone 或 Link 场景打开 Profiler,记录默认 GPU ms 与 CPU ms。只改一项:URP Render Scale 0.9 或 FFR 提一档,同场景复测——哪一项降 ms 更多?边缘画质能否接受?
问题 2(问答型) Single Pass Instanced 与 Multi-Pass Stereo 各适合什么场景?为何移动端几乎不用 Multi-Pass?
问题 3(选型型) GPU ms 顶满、CPU 有余量;已 Single Pass、LOD 正常。下一步优先 FFR、降 MSAA 还是降 Shadow Distance?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- XR 性能预算
头显刷新率对应的帧时间上限。详见 XrPerformanceBudgetDiagram target 90/72。
- Single Pass Instanced
一次 Draw 通过实例索引输出双眼。详见 SinglePassStereoDiagram mode single。
- Multi-Pass Stereo
左右眼各渲染一遍的 Legacy 路径。详见 SinglePassStereoDiagram mode multi。
- Foveated Rendering(注视点渲染)
注视区高分辨率、周边降采样。详见 FoveatedRenderingDiagram。
- Fixed Foveated Rendering (FFR)
固定视场中心的注视点渲染,Quest 等平台常用,无需眼动硬件。
- Render Scale
URP 渲染分辨率相对 eye buffer 的比例;XR 下直接缩放 Fill rate。
- XR 输入开销
HMD/控制器/手部每帧 Poll 与交互射线 CPU 成本。详见 UrpXrSettingsDiagram highlight input。
- URP XR 设置
XR Plug-in + URP Renderer 立体模式、MSAA、Quality 等成组配置。详见 UrpXrSettingsDiagram。