技术流:Unity5中12个优化VR应用的技巧

VR应用比非VR应用须要更强的计算,性能优化是一个很重要的任务。若目标平台是像GearVR这样的手机设备,优化就更重要了。如下是一些应该试着了解的性能指标:性能优化

每只眼睛50次绘制调用。Unity2018更精确地将其称为SetPass Calls。场景中顶点数少于50K~100K且面数少于50~100K。异步

下面是一些简单的技巧,用于知足上述要求:编辑器

静态批处理工具

场景中可能存在大量的静态几何体,例如墙体,椅子,灯光和从不移动的网格。在编辑器中将它们标记为静态对象。为烘焙光照贴图,请确保将其标记为静态贴图。不要让每一个对象都会致使一次绘制调用,而是把对象标记为可被组合成一个网格的静态对象。性能

静态批处理有个关键要求:全部对象必须使用相同的材质。若静态墙带有木头材质,静态椅子带有铁材质,全部墙会被批量处理为一次绘制调用,椅子做为单独网格进行另外的绘制调用。学习

纹理集优化

如以前所说,每一个材质引起一次绘制调用。直觉多是木门和铁椅子须要使用不一样的材质,因为它们的纹理不一样。然而,若使用相同的着色器,就能够用纹理集为它们建立共用的材质。纹理集就是一个包含全部小纹理的大纹理。咱们可使用一个材质加载一个纹理,而非使用多个材质加载屡次。每一个对象能够对应到纹理集中不一样坐标的一个纹理。动画

你能够的绘制管线中手动生成纹理集,可是Juan Sebastian的Pro Draw Call Optimizer工具很是有用。它能够生成纹理集,而且在替换新对象时不会搞混资源。spa

动态批处理设计

非静态对象能够动态批处理为一个单独的绘制调用。我曾注意到该过程大量占用CPU且每帧都在计算,但这是一个很好的优化。这只对使用相同材质且顶点数少于900的对象有效。使用纹理集为全部的动态对象建立一个材质,就能够进行简单的动态批处理啦。

LODs(多细节层次)

LOD组是改善性能的简便方法。使用有多个LOD的资源,并用低分辨率的几何体渲染离相机远的对象。Unity能够自动随着相机临近在各个LOD间转换。

填充率,过分绘制和裁剪

这是个值得关注的话题。减小过分绘制,最远的对象最早绘制,随后中上面依次绘制更近的对象。这个在平均分辨率为1080P的PC显示器上没什么问题,但对于有极高分辨率的VR和手机设备来讲问题就比较严重。大量的过分绘制组成了大量像素从而影响填充率。纹理填充率是限制GPU性能的关键。

一些解决方案提供了遮挡剔除和视锥体剔除。视锥体剔除是指不渲染位于相机视锥体外的对象。不渲染看不到的对象!遮挡剔除是剔除被其它对象挡住的对象。好比,门后的房间能够被总体剔除。默认状况下,遮挡剔除是针对整个场景的,若是关卡设计得当甚至可让你剔除游戏中的整个关卡。

LOD组固然也能够裁剪离场景很远的对象,进一步使填充率最小化。

关卡设计

若游戏涉及到玩家从一个房间移到另外一个房间,简单的解决方法是一个关卡包含整个游戏。缺点在于内存的消耗。尽管每一个房间中的各对象和材质都不可见,但其仍会被加载到内存中。将每一个房间放置于单独的关卡中,在代码中智能的异步加载关卡能够改善性能。

异步加载

在玩家即将进入下个房间以前,加载下一个关卡。不要使用Application.LoadLevel()同步加载,由于加载时会致使游戏挂起。因为头盔的跟踪是实时的,这会致使眩晕,对玩家来讲体验太糟糕。

使用Application.LoadLevelAsync()来加载关卡。你能够在Oculus Mobile SDK BlockSplosion例子的StartupSample.cs中找到使用方法。

光照烘焙

关掉实时阴影!接受动态阴影的对象不会被批处理,这会致使严重的绘制调用。

在PC机上,使用单个实时方向光就能够实现很好的动态阴影效果。对于大多数现代的PC均可以提供逼真的逐像素阴影。然而在移动平台,你须要烘焙光照而不是实时阴影,以高分辨率烘焙光照结合软硬阴影实现相似的效果。

阴影

尤为是为了高性能的手机体验,对于3D对象的阴影处理要使用传统技巧。能够经过在对象下放置一个简单的带有模糊阴影纹理的2D四边形模拟半真实的阴影。

VR提示:不要尝试使用阴影缓冲。预处理光照环境并在角色下方使用老套的模糊阴影纹理处理方法。

 

光线探测器

当使用烘培光照时,静态对象效果不错但动态对象有点欠妥。对于动态对象可使用光照探针来模拟简单的动态光照。

光照探针是烘焙好的立方贴图,存储了场景中多个点直接、间接甚至自发光的信息。当动态对象移动时,它在光照探测器附近进行插值获取近似某个点的光照。这是一种在动态对象上模拟实时光照的简便办法,而不用成本高昂的实时光照。

Unity的文档解释了光照探针要如何放置。

避免使用透明和多个材质的对象

相似玻璃这种使用透明着色器的对象很消耗性能。使墙壁看起来更逼真的常见作法是,用一个带有灰尘或锈斑纹理的透明材质,加上另外一个单独的基本漫射材质。多材质的alpha混合是很消耗性能的,每一个材质都会增长一次绘制调用!可是请注意:多个纹理并无问题,使用多个材质才耗费性能。使用一个材质结合着色器来实现多纹理的alpha混合,而非使用多个单独材质。

蒙皮网格渲染器

蒙皮网格渲染器经常使用于角色身上,它带有动画关节,可使用物理(布娃娃)变或自定义动画(走,跳等)来实现逼真的网格变形。

坏消息是:蒙皮网格渲染器不支持批处理。对于每只眼睛,场景中各角色都会进行屡次绘制调用。目前还没什么解决方案。

 

更多Unity的实用技巧请前往paws3d学习中心,近期又有资深游戏设计师在线分析辐射4的游戏关卡设计思路,喜欢游戏开发的小伙伴请不要错过。连接:https://www.paws3d.com/learn/官方Q群935714213