SuperAPI AI 工具集

hz-unity-code-review

编程与开发

查看项目

更新于 10-15 14:57

技能介绍

用途

该技能用于审查面向 Meta VR 头显与 Horizon OS 的 Unity C# 代码或项目设置,帮助在代码审查阶段发现 VR 性能问题、渲染配置问题和常见 VR 开发陷阱。适用场景包括:审查脚本的 VR 性能问题、检查渲染管线配置与设置、确保遵循 Meta VR 特定最佳实践、识别常见 VR 开发陷阱、验证控制器/手势/眼动追踪的输入处理、审计内存使用与 GC 分配模式。

主要审查领域

1. 渲染管线配置

Meta VR 应用必须使用 Universal Render Pipeline(URP)并采用针对移动 VR 优化的特定设置,新项目不建议使用 Built-in Render Pipeline。需验证的关键设置:启用单通道多视图(Single-pass multiview,位于 Player Settings > XR Plug-in Management > Oculus > Stereo Rendering Mode);Vulkan 作为主要图形 API;线性色彩空间(Linear color space);在 URP asset 设置中禁用 HDR;后处理应尽量少或禁用。

2. Draw Call 预算与批处理

Meta VR 的 Draw Call 预算随工作负载复杂度变化,每个 Draw Call 都有 CPU 开销并直接影响帧时序。资料给出的参考指标:Quest 2 / Quest Pro 在繁忙模拟下 80-200、中等 200-300、轻量 400-600;Quest 3 / Quest 3S 与 Meta VR Glasses 在繁忙模拟下 200-300、中等 400-600、轻量 700-1000。每帧三角形数:Quest 2 / Quest Pro 为 750K-1M,Quest 3 / Quest 3S 与 Meta VR Glasses 为 1M-2M。SetPass calls 目标:Quest 2 / Quest Pro 小于 50,其余小于 80。需启用并验证:静态批处理(非移动几何体)、GPU instancing(重复对象)、SRP batcher(URP 材质)、动态批处理(小于 300 顶点的小网格)。

3. Shader 复杂度

Meta VR 上的移动 GPU 无法处理桌面级 Shader。需审查所有材质:使用 URP/Lit 或 URP/Simple Lit 而非 Standard shader;自定义 Shader 应尽量减少纹理采样和 ALU 运算;尽可能避免实时阴影(改用烘焙);不使用屏幕空间效果(SSAO、SSR、屏幕空间阴影)。

4. 内存管理

GC 分配会导致帧卡顿,必须从热路径中消除。资料给出反例与正例:反例在 Update 中拼接字符串、调用 FindObjectsOfType 并使用 LINQ 过滤;正例使用预分配的 StringBuilder、List 缓存和数组,在 Start 中完成查找,Update 中仅做无分配操作。

5. 输入处理

Meta VR 支持多种输入方式,代码应处理:控制器(新项目推荐使用 Unity Input System Package;OVRInput 为旧版支持维护);手势追踪(OVRHand 和 OVRSkeleton 获取手部姿态数据);眼动追踪(OVREyeGaze,Quest Pro / Meta VR Glasses,需要权限);在控制器与手势追踪模式间平滑切换。

6. 物理配置

移动端物理模拟开销大,需审查:物理时间步长与目标帧率匹配(72/90/120 Hz);简化碰撞网格(使用基本体而非 Mesh Collider);减少求解器迭代次数(通常 4-6 足够);使用基于层的碰撞矩阵减少配对检查;合理配置 Rigidbody 休眠阈值。

7. 音频设置

音频常被忽视但会影响性能:压缩音频剪辑(音乐用 Vorbis,短音效用 ADPCM);超过 1 秒的剪辑使用流式加载类型;限制同时播放的音频源(目标小于 16);使用 Meta 音频 SDK 进行 3D 空间化。

快速审查清单

资料提供的目标值包括:Draw calls 80-200(繁忙)至 400-600(轻量);三角形 750K-1M/帧;纹理分辨率最大 2K,4K 谨慎使用,要求 ASTC 压缩;Shader 使用 URP 移动端 Shader,不用 Standard shader 和屏幕空间效果;渲染模式为单通道多视图,必须在 XR 设置中启用;FFR 启用(High 或 HighTop);MSAA 质量 4x / 性能 2x;目标帧率最低 72 Hz,推荐 90 Hz,120 Hz 用于流畅体验;稳态 GC 分配 0 B/帧,Update/LateUpdate/FixedUpdate 中无分配;同时音频源小于 16,使用池化。

代码中需关注的反模式

资料列出 GC 密集模式:Camera.main(内部调用 FindWithTag)、GameObject.Find("name")(每次调用线性搜索)、Update 中的 GetComponent<T>()(应缓存)、Update 中的 new List<T>()(堆分配)、Update 中的字符串拼接(创建新字符串对象)、非 List 集合上的 foreach(枚举器分配)、LINQ 查询(多次分配)、装箱(int -> object,堆分配)、热路径中的 delegate/lambda(闭包分配)。

Update() 误用:空 Update 仍有开销;不需要每帧执行的逻辑(如 SavePlayerPrefs)应改为事件驱动;非每帧逻辑应使用事件、协程或 InvokeRepeating。

Camera.main 反模式:应缓存引用而非在 Update 中反复访问。

热路径中的 Find 调用:应在 Awake/Start 中缓存或使用依赖注入。

使用 metavr 进行验证

可使用 metavr 工具验证构建并检查设备端行为。调用方式为 metavr <args>(以 npm 包 metavr 发布;若 metavr 不在 PATH 中,运行 npx -y metavr <args>),无需安装。示例命令:

# 检查已连接的 Meta VR 设备
metavr device list

# 安装并运行构建
metavr app install path/to/build.apk
metavr app launch com.company.app

# 检查设备日志中的错误
metavr adb logcat --tag Unity

# 监控 GPU 性能
metavr perf capture

建议使用设备端性能分析验证代码审查发现是否转化为实际性能改进。

参考文档

资料提及以下参考文档:Performance Checklist(综合性能目标与优化策略)、Rendering Best Practices(Meta VR 特定渲染配置与 Shader 指南)、Input Handling(控制器、手势追踪与眼动追踪实现)、Common Pitfalls(常见错误及其修复)。

限制

资料未提供该技能的安装方式、收费模式、支持平台版本、具体使用步骤等细节,暂未提供。