2021年元宇宙概念火了,Facebook改名Meta全力投入,国内大厂也纷纷布局。VR/AR作为元宇宙的核心入口技术,越来越受关注,很多开发者开始投入VR/AR内容开发。
但VR/AR应用的性能要求比传统应用高得多。需要90Hz甚至120Hz的高帧率才能保证画面流畅,需要低于20ms的延迟才能不晕,还要左右眼分别渲染,工作量是普通应用的两倍。很多开发者刚开始做VR/AR都会遇到卡顿掉帧、延迟高、头晕的问题。
我在VR/AR行业做了三年多,从Oculus Rift到HTC Vive再到Quest 2和Pico Neo 3,做过VR游戏也做过行业应用,还做过AR试穿和导航。踩了很多坑也总结了很多经验。今天分享VR/AR性能优化的实战经验,从硬件选择、引擎优化、渲染优化、脚本优化到测试方法,帮你把应用从慢优化到快。
以下经验基于我们的项目实践,主要用Unity引擎,也有一些Unreal的经验。不同项目不同硬件优化方法会有差异,大家灵活参考。
一、为什么性能优化这么重要
第一,保证不晕是最基本的要求。VR最忌讳晕,很多人体验VR会头晕恶心。主要原因就是帧率低和延迟高。帧率不够画面卡顿,或者头部转动了画面没及时更新,大脑就会产生错觉导致头晕。所以要保证不晕首先要保证高帧率低延迟。
第二,保证体验流畅沉浸感强。VR/AR的核心是沉浸感,让用户觉得真的在虚拟世界里。如果画面卡顿掉帧延迟高,或者模型加载慢交互不流畅,沉浸感就被打破了。
第三,保证应用能在目标硬件上运行。VR一体机比如Quest 2性能有限,大概相当于中低端手机。不做优化的话可能根本跑不起来,或者帧率很低没法用。
我们的优化目标是:帧率稳定90帧至少72帧,延迟低于20ms最好15ms,包体控制在2GB以内,内存控制在设备内存60%以内。
二、硬件选择和适配
性能优化第一步是硬件选择和适配。不同VR/AR硬件性能差异很大,优化方法也不一样。
现在的硬件主要分几类:PC VR比如Rift S、HTC Vive、Valve Index,需要连接PC,性能取决于PC配置。VR一体机比如Quest 2、Pico Neo 3,不需要连PC,便携但性能有限,是现在的主流。AR眼镜比如HoloLens 2,性能更有限。手机AR比如ARKit和ARCore,性能取决于手机。
选好目标硬件后要充分了解它的性能限制。比如Quest 2用骁龙XR2,CPU 8核最高2.84GHz,GPU Adreno 650,内存6GB,单眼分辨率1832x1920,90Hz。这个性能大概相当于骁龙865手机,但因为要双眼渲染还要高帧率,实际能用的性能少很多。
如果需要支持多个硬件,要做好多硬件适配。根据不同设备自动调整画质和性能设置,性能强的PC VR开高画质,性能中等的一体机开中等画质,性能弱的设备开低画质保证帧率。Unity的Quality Settings和Unreal的scalability设置都能实现这个功能。
三、引擎优化
选好硬件后是引擎层面的优化。
如果用Unity,有几个重要优化点。第一,使用URP通用渲染管线。URP比内置渲染管线性能更好,更适合移动端和VR/AR,还支持SRP Batcher减少draw call。现在做VR/AR推荐用URP,不要用内置管线或HDRP,HDRP画质好但开销大不适合一体机。
第二,开启VR相关优化选项。单通道实例化渲染(Single Pass Instanced)一定要开,能把左右眼渲染合并到一个pass,减少draw call。固定注视点渲染(FFR)也要开,降低视野边缘的渲染分辨率提升性能,人眼边缘视力差几乎看不出来。
第三,合理设置帧率和分辨率。目标帧率设90帧。渲染缩放可以设0.7到0.8,降低渲染分辨率提升性能,VR里影响不大。
第四,优化导入设置。模型优化面数合并mesh,纹理压缩用ASTC格式,分辨率不要太大,能256就不用512。音频压缩用合适格式,背景音乐用流式加载。这些看起来小但对性能和内存影响很大。
如果用Unreal,推荐用Forward渲染,比Deferred渲染性能好。开启Instanced Stereo和FFR。合理设置scalability等级,一体机上设中等或低保证帧率。资源优化和Unity类似,减少面数压缩纹理。
四、渲染优化
渲染是VR/AR最大的性能瓶颈,因为要双眼渲染且分辨率高帧率要求高。
1. 减少draw call。draw call太多CPU会成为瓶颈。VR因为双眼渲染draw call是普通应用两倍,更要控制。方法包括合并静态mesh,用Static Batching。大量重复物体用GPU Instancing,一次draw call渲染很多实例。合并材质用纹理图集减少材质数量。用SRP Batcher合并相同Shader的材质。一体机上draw call建议控制在1000以内最好500以内。
2. 降低渲染分辨率。渲染分辨率对GPU性能影响最大。用渲染缩放降到0.7到0.8,GPU需要渲染的像素减少36%到51%,提升非常明显。虽然画面稍微模糊但VR里影响不大。配合FFR只降低边缘分辨率保持中心清晰,几乎看不出画质下降。
3. 优化光照和阴影。实时光照和实时阴影开销很大。静态场景用烘焙光照(Lightmap),把光照信息烘焙到纹理里运行时直接采样,开销很小。减少实时光照数量,一般1到2个方向光就够了。实时阴影要控制数量,只有重要物体投射阴影,阴影分辨率不要太高,距离不要太远。用简单的Shader,不要用太复杂的次表面散射、折射等Shader。
4. 优化后处理。后处理对GPU性能影响大。抗锯齿推荐用MSAA 2x或4x,不要用FXAA/TAA这些后处理抗锯齿,开销大还有拖影。bloom开销大不需要就关。景深在VR里不需要还可能导致晕,关掉。运动模糊绝对不要开,VR里头部一直在动,运动模糊会让画面很糊很晕。颜色校正可以保留,开销相对小。
5. 优化遮挡剔除和LOD。遮挡剔除(Occlusion Culling)能不渲染被挡住的物体,室内场景效果非常明显。LOD让远处物体用低精度模型,近处用高精度,大大减少三角形数量。视锥剔除引擎默认就开了,但注意不要把很大的mesh合并成一个导致视锥剔除失效。
五、脚本和逻辑优化
除了渲染,脚本逻辑也影响CPU性能。VR的CPU不仅要处理逻辑还要处理渲染指令和输入追踪。
第一,减少Update里的计算。不需要每帧更新的就不要放Update里。AI逻辑、状态检查可以隔几帧更新一次或用定时器。用事件驱动代替轮询,不要每帧检查状态。缓存组件引用,不要在Update里用GetComponent或Find。避免在Update里创建对象导致GC。
第二,优化GC垃圾回收。GC会暂停游戏导致卡顿,VR里卡顿就会晕。减少字符串拼接,用StringBuilder。用对象池复用频繁创建销毁的对象比如子弹特效。避免在频繁调用的函数里new对象。用值类型代替引用类型。用Profiler监控GC,尽量把运行时GC降到0。
第三,优化物理。物理也是CPU开销大的部分。减少刚体和碰撞体数量,不需要物理的就不加。用简单碰撞体,不要用复杂网格碰撞体。物理步长不要太高,默认0.02秒就够了。用分层碰撞矩阵减少物理检测数量。避免频繁修改刚体速度位置。
第四,优化UI。UI也容易产生性能问题。用TextMeshPro代替默认Text,支持SRP Batcher减少draw call。UI纹理打包成图集。不需要的UI就隐藏。列表动态元素用对象池复用。不要在Update里更新UI,变化时才更新。
六、网络和资源加载优化
联网应用或需要动态加载资源的场景,网络和资源加载也要优化。
资源加载方面,用Addressables管理资源,按需加载异步加载,减少初始包体和内存占用。加载时用异步加载避免主线程卡顿。加载界面保持帧率,不要让用户看到卡顿画面。不用的资源及时卸载释放内存。
网络方面,减少网络数据量,用二进制序列化代替JSON,压缩数据,只同步必要的状态变化。降低同步频率,10到20次每秒就够,用插值平滑中间状态。实时状态同步对延迟要求高,建议用UDP或可靠UDP比如kcp,不要用TCP,TCP延迟高丢包时会阻塞。
七、性能测试和分析方法
性能优化不能凭感觉,要用工具测试分析找到真正的瓶颈。
Unity Profiler是最常用的性能分析工具,能看到CPU、GPU、内存、渲染、物理、UI各部分开销。一定要连接真机测试,编辑器里性能和真机差异很大,尤其是一体机性能差很多。
Frame Debugger能看到一帧里所有draw call,找到draw call太多的原因。Memory Profiler看内存占用和泄漏。GPU性能分析用Qualcomm Snapdragon Profiler,因为一体机大多用高通处理器,能看到GPU各阶段耗时。
除了工具测试,还要真机体验和用户体验测试。自己戴上设备实际感受有没有卡顿掉帧延迟高晕不晕。最好找不同的人测试,不同人对晕的敏感度不同。
八、写在最后
以上就是VR/AR性能优化的实战经验。从硬件选择、引擎优化、渲染优化、脚本优化、网络资源加载到测试分析,各个方面综合优化才能保证高帧率低延迟好体验。
性能优化是持续的过程,不是一次就能完成的。开发全过程都要关注性能,定期测试发现问题及时优化,不要等到最后才发现性能不行,那时候再优化就很困难了。
2021年元宇宙很火,VR/AR作为核心入口发展很快。但VR/AR内容开发和传统手机PC开发有很大不同,对性能和体验要求更高,需要掌握更多优化技巧。
希望这篇文章能给正在做VR/AR开发的朋友一些参考,少踩坑少走弯路,做出更多优质的VR/AR内容。也希望VR/AR行业发展越来越好,硬件性能越来越强,内容越来越丰富,让更多人感受到VR/AR的魅力。
性能优化没有终点,只有更好没有最好,永远把用户体验放在第一位,持续优化持续进步。祝所有VR/AR开发者都能做出流畅不晕体验好的优质内容。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录