12个优化Unity/GearVR应用的小技巧 比起那些普通应用,VR应用所需的计算性能要求大了太多,让优化成为了一项重要工做。若是你的目标是相似 Gear VR 这种移动设备,那么要求会更高。异步
如下为一些基本的标杆:编辑器
➜➜单眼 50 个绘制调用(Draw Call)。Unity5 更加精准地称之为口令设置程序调用(setpass calls)。 ➜➜少于50000-100000个顶点数以及50000-100000个多边形数量。 确实是很严苛的要求,而这里有一些小技巧来助你一臂之力。性能
静态批处理(Static batching) 在一个场景里,可能有一堆静态几何图形,好比墙、椅子、灯光和各类静止网格(Mesh)。你能够在编辑器里把它们标成静态。确保将他们标记成静态光源映射来获得烘焙好的光照贴图纹理。被标记成静态的物品会被组成一个网格,而非每绘制一次物品就产生调用。 但静态批处理有一个关键的要求:全部物品必须都有一样的材质。若是你有木头材质的静态墙壁和一个钢铁材质的静态椅子,全部墙壁会被组合成一个网格,消耗一个绘制调用,而椅子则也会有一个网格,占用另外一个绘制调用。优化
纹理集合(Texture atlasing) 如上文所说起,每一个不一样材质都会至少致使一个新的绘制调用。你可能会觉得一个木头门和铁椅子必须使用不一样的材质,毕竟它们使用了不一样的纹理。可是,若是它们 能使用一样的着色器,你可使用纹理集合来建立一个材质,同时兼容这两个物体。一个纹理集合其实就是一个大纹理贴图,里面包含了各类各样的小纹理。你可让某个材质加载几个纹理而非让一堆材质加载一堆纹理。每一个物体都能经过不一样的纹理映射来加载这个纹理集合上不一样坐标位置的一小片纹理。 你能够手动去作这个事,而做为参考,Juan Sebastian’s Pro Draw Call Optimizer 很是有用。它能自动生成纹理集合,而不会干扰你的 assets。动画
动态批处理(Dynamic batching) 移动的非静态物品也能被动态批处理为单一绘制调用。这对于 CPU 来讲开销较大,每帧都通过计算,但就优化最终结果来讲仍是不错的。不过要注意的是这只对低于 900 个顶点并有着一样材质的物体才有用。使用纹理集合来为你的动态物体建立一个单一材质,而后你就能获得简单的动态批处理了。设计
多细节层次(Level Of Details) 多细节层次组也是一个提高表现的简单方式。使用拥有多个细节层次的 assets 并让离镜头远的物体采起低细节的几何图形进行渲染。Unity 能自动在摄像头和物体之间的距离发生改变时过渡到不一样的细节层次。 填充率,重复绘制,过滤剔除(Fillrate、overdraw and culling) 下降重复绘制,不要让远处物体的像素被绘制了后,近处覆盖在这个像素的物体上面时又绘制了一次。对于平时在PC上倒不是太所谓,但对于移动VR,这也是性能开销啊。大量的重复绘制和高分辨率影响了你的填充率,而纹理填充率也是GPU的限制之一。 目前,解决方式包括遮挡剔除(occlusion culling)和层次视锥剔除(frustum culling)。层次视锥剔除能将摄像机视野锥体外的东西都剔除掉,毕竟渲染那些你根本没有看着的东西毫无心义。而遮挡剔除则是不渲染那些被挡住的物体,好比门后的房间,沙发后的桌子什么的。默认状态下遮挡剔除能搞定你的整个当前场景,但若是关卡设计得当,整个关卡都能被剔除掉。 多细节层次组也能剔除掉离摄像头太远的物体,以进一步下降填充率。游戏
关卡设计(Level design) 若是你的游戏是让玩家从一个房间(地区)到另外一个房间(地区),那基本的方式就是让整个游戏只在一个关卡中。但这样会致使太高的内存开销 – 每个房间内的物体和材质都会被加载到内存里,即使在当前场景中是不可见的。因此,将房间放到不一样的关卡里,经过代码设计来分开加载。内存
异步加载(Asynchronous loading) 当玩家快要接近到加载下一关的门时,加载下一关。不要同时使用Application.LoadLevel(),这会致使游戏暂停卡顿。即使头部跟踪只停了一小会,也会让玩家很是不适。 所以,采起Application.LoadLevelAsync()。关于范例你能够查看Oculus Mobile SDK 下的BlockSplosion样品,在StartupSample.cs里。文档
光照烘焙(Baked lighting) 关闭实时阴影!获得实时阴影的物体将没法被批处理,致使大量的额外绘制调用的开销。 在PC上,你能仅经过单一的即时方向光来获得不错的动态阴影,但在移动端,请用烘焙好的光照,不要用实时阴影。it
阴影(Shadows) 尤为对于移动体验来讲,请对立体物品的阴影使用之前那些小技巧。半真实的阴影能够经过在物体下面增长一个平面模糊灰色图形来达到。 好比,千万不要用这种高端电脑才能搞定的GTA V实时动态阴影。 但你能够用相似这种:下图来自2002年的GTA罪恶城市,只是在人物下面增长了一个模糊的小圆球而已。
光照探针(Light probes) 当使用烘焙好的光线后,那些动态物品看起来违和感很高,而静态物品很是好。解决的办法之一就是经过光照探针来模拟动态光源。 光照探针是烘焙好的立方体贴图,在场景中的各个点上存储直接、间接乃至发散的光线。当动态物体移动时,它会提取最近的几个光照探针的样品来模拟在那个部位的光线。这是模拟真实光线而无需依赖昂贵的实时光线的方式。 Unity提供了一个不错的文档来告诉你应该如何放置光照探针。 避免透明和多材质物品 使用透明着色器的物品,好比玻璃、窗户等都很是昂贵。还有一些专门让物品看起来更真实的方式,好比在墙壁前增长一层锈色或灰尘透明的材质等等。这类多材质alpha融合都很是昂贵,每一个材质都会增长一个绘制调用。可是,多纹理就无所谓了,因此你应该只用一个材质,并用一个能够经过alpha融合来融合多个纹理的着色器。
蒙皮网格渲染器(Skinned mesh renderers) 蒙皮网格渲染器在渲染那些有动画部件的角色时比较经常使用,能经过物理或定制的动画来达到真实的网格变形。 不幸的是,蒙皮网格渲染器不会被整合进批处理中去。每一个场景里的角色都会致使单眼增长几个绘制调用。