unity中的VR适度优化

来源:腾讯GWB游戏无界
译者:艾涛

简介

由于为你选择的平台实现目标帧率是确保用户拥有一个良好无晕眩感的VR体验所必需的条件,因此最优化是VR发展的一个决定性因素。与其他一些平台不同,VR最好尽早并经常加以优化,而不是把优化留到以后的发展阶段。定期测试目标设备也是也是非常有帮助的。

相比于非VR项目,VR项目计算开销更加昂贵,主要是由于所有东西必须为每只眼睛渲染一次,因此在创造你自己的VR体验时需确保你熟悉一些常见问题。如果你事先知道这些问题,你能围绕它们设计你自己的项目,在你的项目的生命周期中能免去随后的很多艰辛工作。

移动VR可能要求尤为苛刻。你不仅有运行一个VR应用的开销,而且移动设备的性能与台式PC的性能相差不少,因此最优化在你的项目中至关重要。

因为接近目标帧速率是很关键的,所以所有的最优化都有价值。不要忘了尽可能地优化你的代码。来看看更详细的Unity代码优化指南。

OCULUS资源

Oculus网站能找到大量的关于VR的优化的信息,这些信息值得你自己先去熟悉。
https://developer.oculus.com/documentation/
http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_G...
https://developer.oculus.com/blog/squeezing-performance-out-of-your-unit...

UNITY编辑器优化工具

Unity中有许多有用的工具和技术,它们能够帮助你优化你的VR内容。

PROFILER

分析器将帮助你了解渲染你游戏的每一帧花费了多少时间,然后将这时间拆分到CPU,渲染,内存,声频,物理及网络中去。理解如何使用分析器对于检查性能及识别需要最优化的区域至关重要。

帧调试器

帧调试器允许你冻结某帧上的回放然后逐步查看独立描绘指令来了解你的场景是如何构建的,并确认这些场景中哪些能够优化。你也许会发现你正在渲染一些不必要的对象,这些将有效帮助你减少每帧的描绘指令。

更多关于帧调试器的信息请查询这些网站:
http://docs.unity3d.com/Manual/FrameDebugger.html
https://unity3d.com/learn/tutorials/modules/intermediate/graphics/frame-...

VR最优化原理

因为最优化是一块很大的领域,需求会改变每个基于你项目的要求和平台,所以我们提供了延伸阅读的兴趣领域。

一般来说,现有的优化技术很好的延伸到VR的发展中,因此,现有的知识能经常应用上。

几何模型

移除你的几何体中的任何用VR永远看不到的面。我们不想要渲染永远不会被看见的东西。举个例子,如果用户永远不会看见一个碗柜的背面因为它靠着墙的原因,那么我们在模型中不需要任何那样的面。

尽可能简化模型设计。根据你的目标平台,你可能想尝试通过贴图增加细节,潜在的视差映射贴图以及曲面细分,这可能影响性能,也许对于你的目标平台也不适合、有效。

Overdraw

Overdraw可以让你查看有哪些对象绘制在了其他对象的前面,而这是在浪费GPU时间。尽可能考虑减少使用overdraw。通过使用场景视图控制栏(Scene View Control Bar),你能查看场景视图中的overdraw。

查看场景视图中的overdraw

正常着色视图:

正常着色视图

启用overdraw后的着色视图:

启用overdraw后的着色视图

细节层次

细节层次(LOD)渲染允许你减少为渲染一个物体所需的三角形数,因为距相机的距离增加了。只要你的目标不是同时全挨着相机,LOD将通过添加一个LOD组件以及提供更低层次的细节,由于距离相机组距离更远的缘故,这减少硬件的负担并提升渲染能力。

细节层次(LOD)渲染细节层次(LOD)渲染

使用Simplygon可以自动完成大部分的asset的LOD预处理。

Draw call批处理

尽可能使用静态和动态批处理来进行draw call批处理。这能极大地提升游戏性能。查看Unity drawcall批处理指南。

光照贴图

尽你所能消除动态照明,使用光照烘焙,以及避免实时阴影。

查看Unity灯光和渲染指南获得更多信息。

光线探头

光线探头允许你在场景中的点中对光线取样并应用到动态目标上去。这相当快,而且经常产生极好的视觉效果。

反射探头

反射探头储存它们周围事物的立方映像贴图来实现逼真的反射,而且能影响性能。请明白在这个时候实时模式的反射探头已经太慢以至于不能在VR中使用。

遮挡剔除

如果目标不能看见,那么遮挡剔除将会阻止对这些对象的渲染。举个例子,如果另一个房间的门已经关了,它已经看不见了,我们便不想要去渲染它。

根据你的项目和你的目标平台,你可以能够执行遮挡剔除,这将能显著提升游戏性能。

一个视锥剔除的实例:

一个视锥剔除的实例

一个遮挡剔除的实例:

一个遮挡剔除的实例

抗锯齿

抗锯齿在VR中是有必要的,因为它能帮助平滑图像和减弱锯齿边缘。如果你使用的是正向渲染,你可以在质量设置中启用MSAA,在Gear VR(虚拟现实头戴式显示器)你应该尽可能地一直启用它。

由于在使用延迟渲染时MSAA并不可靠,你可以启用抗锯齿作为一个后处理,或研究使用MSAA。这个社区有一个实例。

纹理

一般来说,你将想要在你的项目中尽可能地使用贴图合并,并减少单独使用的纹理和材料的数量。

为简化和加速这个过程,网格烘焙(MeshBaker)能够用来烘焙网格和材料以增强你的游戏性能。

来自Turbo按钮公司的霍尔登在Oculus Connect 2开发者大会上谈到了常用的优化方法使用网格烘焙。

请注意法线贴图在VR中通常不好看,所以你可能希望避免这种情况,那么请查看关于渲染的Oculus文件来获得关于纹理的更多信息。

着色器

在适当情况下,使用Gear VR时都应尽力使用最基础的着色器,你可能希望利用耗费更少资源的Mobile>Unlit shader(Supports Lightmap)给你的场景提供光照贴图。

全屏效果

全屏效果是会耗费许多资源的,你很可能想要在Gear VR中彻底避免使用它。

质量设置

质量设置决定了你的项目的视觉效果质量的各个方面。改变这些属性可以以视觉效果质量为代价帮助提升游戏性能。

渲染比例

改变VR设置-渲染比例(VRSetting.renderScale)将对换表现的清晰度。有关更多信息和示例,请参见我们的VR发展入门文章。

异步加载

你可能希望把你的项目分成几个独立的场景来提升性能。如果你这样做了,一定要注意,当加载下一个场景时你会想要避免锁定对头部的追踪,因为这会导致恶心。

为了避免这种情况,你如果想在追踪头部设备的同时加载场景,可以使用场景管理-不同步加载场景设置(SceneManager.LoadSceneAsync)来不同步加载下一场景时。

示例场景中的优化技术

为确保GearVR和DK2良好性能,我们已经在示例场景中实施了多项优化技术。

因为我们想要利用同样的项目来适配所有的平台,所以我们要针对最低端的硬件;在我们的情况里,Gear VR是我们的低端平台,我们选择了一个低多边形艺术风格,定义了一些基础颜色来让物体从环境中突出出来。

因为我们正在使用正向渲染,我们能够在编辑 > 项目设置 > 质量设置(Edit > Project Settings > Quality Settings)中启用4xMSAA来获得更好的视觉效果。

unity中的VR适度优化

让我们快速浏览一下在这个场景中这项技术的应用:

菜单场景优化

就像我们所有的场景一样,这项技术使用了低多边形条件,而且并不使用实时光照。

我们正在给菜单面板使用了一个叫SeparableAlpha的着色器,它允许一个单独的透明通道被定义为图像的序列。这意味着并非每一个图像、菜单里的图片都需要它自己的透明通道。这种方法节省了文件大小,并消除了一些锯齿。

Flyer场景优化

我们能够在flyer场景上动态启用fog,以确保生成的对象不突然蹦进视野,并缩短了视距,这意味着需要渲染的物体更少。

陨石有一个顶点数目比较低,意味着动态批处理(Dynamic Batching)能够使用来减少draw call。

为了重利用对象,我们已经创建了一个对象池来处理很多的激光、陨石和星门。这避免了昂贵的初始化实例化调用。

这里需要注意的是flyer场景中的飞船纹理,通过使用Detail Map slot中的次级UV 通道,可以只需使用更少的色块。这样一来我们就可以缩减总体的纹理大小。

迷宫场景优化

迷宫环境是使用lightmap的,这意味着在运行时间它有着更好的性能,尤其是在Gear VR中,因为它使用更低功率的移动设备来运行该项目。否则它只是一个简单的没有实时光照,只有简单的效果的场景。

Shooter180 (目标美术馆)和Shooter360 (目标竞技场)场景最优化

与其他的游戏一样,我们在这些场景中重利用低多边形艺术风格,目标的对象池以及一个低的顶点数目来完成动态批处理。

现在的话你应该对最优化的某些方面有了一些了解,比如你如何使用内置Unity工具来帮助分析性能以及一些关于如何得到一个更好的帧速率的技巧。

来源:腾讯GWB游戏无界
译者:艾涛
转载此文目的在于传递更多信息,原文作者未做权利声明,视为共享知识产权进入公共领域。

最新文章