Unity VR优化
发表于2018-07-19
VR游戏的流畅度是影响用户体验的一个很重要的因素,为了让玩家在使用VR的过程中不至于有眩晕感,就需要对VR应用就好优化,下面就给大家介绍一些VR方面的优化技巧。
性能分析器
性能分析其可以让你了解游戏中每帧渲染的时间开销,并通过处理器、渲染、内存、音频、物理和网络进行分项显示。执行性能测试时,了解性能分析器,找到需要优化的方面非常重要。
帧调试器
使用帧调试器可以让你冻结任意帧的反馈,进入每个单独的Draw Call以检查场景构建的过程,并找到那些需要优化的位置。从中你可以找到那些对无需渲染对象进行的渲染操作,从而极大的帮助降低每帧的Draw Call数。
VR优化基础
优化是一个内涵丰富的领域,包含了多方面的知识,需要对每种目标平台和工程单独考虑。在此,我们列出不同的兴趣点以便于深入阅读。
In general, existing optimisation techniques carry over well into VR development, so existing knowledge can often be applied.
一般来说,已有的优化技术可以照搬到VR开发中去,因此既有优化知识通常是可以复用的。
几何体
移去VR场景中永不可见的几何体表面,不要为不可见的东西浪费宝贵的渲染资源。如:靠墙放置的柜子的背面是不可见的,那么我们就无需在模型中为其建立几何表面。
尽可能简化几何网格,根据目标发布平台采取增加纹理提高细节,使用视差贴图或曲面细分的技术,虽然这会对性能造成影响,也可能无法适用于或根本不能用于你的目标发布平台。
遮挡绘制
Overdraw面板可以让你看到那些绘制在别的物体之前(上)的物体,遮挡绘制会导致GPU时间的浪费。优化时应考虑尽最大可能减少遮挡绘制的数量。可以在场景视图中使用Scene View工具栏打开它。
细节级别
细节级别(LOD)渲染能减少距离摄像机较远的游戏物体需要渲染的三角形数量。只要游戏物体不是同时出现在摄像机附近,通过添加LOD组件并为距离摄像机较远的游戏物体指定精度较低的网格模型组, LOD就能降低对硬件设备的负载并提高渲染性能。
使用Simplygon可以自动为大部分游戏资源进行LOD预处理。
Draw Call批处理
尽可能使用静态批处理或动态批处理的来批处理Draw Call调用,这可以大幅度增加游戏性能。可以查看Unity指南Draw Call Batching进行学习。
光照贴图
尽可能削减动态光照而使用烘焙得到光照效果,避免使用实时阴影。
光线探测
光线探测对场景中某点的光照进行取样并将其应用于动态物体上,执行速度较快,通常能获得很好的视觉效果。
反射探测
反射探测存储了周围环境的立方体贴图从而获得真实的反射,反射探测会显著影响游戏性能。请注意实时的反射探测速度很慢目前还无法应用于VR中。
遮挡剔除
遮挡剔除关闭了对不可见物体的渲染。例如,房门关闭无法看到室内情形时根本无需渲染另一间屋子。
能否实现遮挡剔除取决于游戏项目要求和其目标平台,但是遮挡剔除可以极大的提高性能。
抗锯齿
抗锯齿能够平滑图像并减少其上的锯齿边缘, VR非常依赖抗锯齿技术。如果你使用正向渲染,可以考虑在质量设置中启用MSAA,对于Gear VR你应该总是确保打开了该设置。
纹理
通常,你会在项目中大量使用纹理图集,并减少单个纹理和材质的使用。
为了简化和加速这个过程,可以用MeshBaker进行纹理、网格以及材质的烘焙以提高游戏的性能。
Holden from Turbo Button公司在Oculus Connect 2上有关于 通用优化技术和MeshBaker使用 的讨论。
注意: VR中法线贴图的效果一般不佳,因此应尽量避免使用。如果想得到更多关于纹理的信息也请访问Oculus documentation on Rendering。
着色器
尽可能多的使用基本着色器。在Gear VR上,尽可能多使用计算代价低廉的Mobile > Unlit (Supports Lightmap) 着色器,也可以用它进行场景的光照贴图。
全屏效果
全屏效果的运算代价高昂,在Gear VR上应尽量避免使用。
质量设置
质量设置决定了游戏视觉质量的各个方面。修改这些参数以获得游戏性能与视觉效果间的平衡。
渲染规模
修改VRSettings.renderScale会在清晰度和性能之间进行平衡,欲获得更多这方面信息和例子可以参考我们的文章Getting Started with VR Development。
异步加载
你可能会考虑将游戏分解到不同的场景中来提高游戏性能,如果你确定要这样做,要小心处置加载下一场景时对头部带来的追踪停滞,因为这会导致眩晕。
为了帮助解决该问题,你可能需要在使用SceneManager.LoadSceneAsync异步的加载下一场景时创建一个具有头部运动追踪的加载界面。
例子场景中用到的优化技巧
我们已经在例子场景中应用了一系列优化技巧以保证它们同时能在Gear VR和DK2上高效运行。
由于要将同样的工程部署在不同平台上,我们以最低硬件配置为目标;此时就是Gear VR啦,我们选择低精度艺术风格,仅仅依靠一些基本颜色来实现物品在环境中的突出显示。
菜单场景的优化
和其他所有的场景一样,使用低精度资源并关闭实时光源。
在菜单面板上使用了一个名为SeparableAlpha的自定义着色器,该着色器能够为图片序列单独定义α通道。这样,一些帧就不需要α通道的信息了。这样既减小了文件的大小,又消除了一些图片边缘的锯齿。
在Flyer场景中使用了雾效果以保证生成的物体不会突然出现在视野中,降低了视野距离以减少需要渲染的游戏对象数量。
降低流星物体的顶点数,这样就可以使用动态批处理来减少DrawCall数量了。
创建对象池实现对激光、流星和门等游戏物体的重用,减少代价高昂的Instantiate调用的使用频度。
这里特别提一下Flyer飞行器的反射材质,通过使用Detail Map栏中的第二个UV通道的小块的颜色样本进行优化,从而降低了纹理的总体大小。
迷宫场景的优化
对迷宫环境进行了光照贴图,这样运行时就能获得更好的性能,特别是在使用性能较差的移动设备的Gear VR上。此外就是使用无需实时光照和最小化特效的简单场景。
Shooter180 (Target Gallery) 和Shooter360 (Target Arena)场景的优化
至于另外一个游戏,我们在场景中重用了低精度艺术风格并针对目标物体建立了对象缓冲池,也使用了减少顶点数以进行动态批处理操作的方法。
至此,你应当对VR优化中涉及的各方面知识都有了一定的了解,如:用Unity自带的工具进行性能分析以及一些提高帧率的好技巧。