教程《七》,优化Unity中的VR

发表于2016-04-06
评论0 3k浏览

  为确保用户有极棒,无恶心的虚拟现实体验,而达到推荐帧率,优化是很关键的一个部分.因为现在VR硬件刚刚起步,所以要尽可能多的在硬件设备上进行测试.

  VR相对于非VR项目的主要不同点就是它要为每只眼睛渲染一次图像,当你了解这一点,创建项目时围绕它进行相关优化将节省大量的开发时间.

  手机上的配置远比不上桌面级电脑硬件,所以在移动设备上的VR做优化是至关重要的.

  当然不要忘记要尽可能的优化程序代码,查看有关代码优化更详细的指    导:”docs.unity3d.com/Manual/MobileOptimizationPracticalScriptingOptimizations.html”.


OCULUS 资源

Oculus网站上有大量的资源文档,非常值得你去看:

https://developer.oculus.com/documentation/

http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/


UNITY 编辑器优化工具

  在Unity中有一些很有用的工具和技术,有助于您优化VR游戏内容.


Profiler

  Profiler可以帮你了解每一帧渲染的时间,并且将其拆分为CPU,渲染,内存,音频,物理和网格.通过使用Profiler检查性能消耗从而针对性的优化.更多关于Profiler的使用请参阅这些链接:

http://docs.unity3d.com/Manual/Profiler.html

https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/profiler-overview

https://unity3d.com/learn/tutorials/modules/intermediate/editor/intro-to-profiler


Frame 调试器

  Frame调试器步进式的查看每帧Draw Call,看每帧是如何构造出眼前的场景的,确定哪些可以优化,哪些是不需要的东西,这将大大有助于减少Draw Call.

  更多Frame 调试器的信息请参阅下列链接:

http://docs.unity3d.com/Manual/FrameDebugger.html

https://unity3d.com/learn/tutorials/modules/intermediate/graphics/frame-debugger


VR优化原理

  虽然优化是个巨大的门类,每个平台,每个需求都会有不同的优化方法.

现有的优化技术可以很好的用于VR项目开发优化


Geometry

  移除VR中任何看不到的三角形,比如如果用户看不到后背,纳闷我们完全可以把角色模型后背的三角面和贴图删除优化掉.另外根据目标平台,试着添加一些细节纹理,比如视差贴图等,虽然这会影响到性能,但是也许它非常适合在特定的目标平台.


Overdraw

  Overdraw视图让你可以了解什么对象被绘制在了另一个对象上面,这种无谓的渲染会浪费GPU渲染时间,通过场景视图中(docs.unity3d.com/Manual/ViewModes.html)开启Overdraw模式查看场景中的覆盖情况.


 

普通视图模式:



Overdraw 模式:



Level of Detail

  Level Of Detail (LOD) 可以让你根据模型物体与相机的距离动态的切换物体三角形面数,只要你的模型距离相机有一定距离,LOD会显示一个低面数的模型来减少对硬件的负载,提升渲染性能.




  用Simplygon(https://www.assetstore.unity3d.com/en/#!/content/10144插件可以自动化处理模型的LOD.


Draw Call batching

  尽可能的将Batch Draw Call,使用

Static Batching  Dynamic Batching会大大提高性能.详见Unity手册

Draw Call Batching(docs.unity3d.com/Manual/DrawCallBatching.html).


Lightmapping

  减少动态光照使用,增加烘焙照明,避免实时光影,详见

avoid realtime shadows(https://twitter.com/ID_AA_Carmack/status/592385473894461441)  Lighting and Rendering(unity3d.com/es/learn/tutorials/modules/beginner/graphics/lighting-and-rendering) .


Light Probes

  Light probes (docs.unity3d.com/Manual/LightProbes.html可以让烘焙光照的场景中动态对象的动态光照实现出来,这个运算很快,但是经常会有很大视觉效果提升.


Reflection Probes

  Reflection probes (docs.unity3d.com/Manual/class-ReflectionProbe.html会根据场景位置将环境贴图存储于Cubemaps,来增加环境反射贴图的真实性,但是实时反射在VR中会很慢.


Occlusion Culling

  Occlusion Culling (docs.unity3d.com/Manual/OcclusionCulling.html)能禁止对看不到的场景渲染,例如一扇门关闭时,我们不想让门那边的另外房间渲染,就可以使用它.使用它可以显著提升性能.

没有进行遮挡裁切的示例:


 


使用了遮挡裁切的示例:

 


Anti-Aliasing

  Anti-Aliasing 抗锯齿在VR中是很有用的,因为它有助于平滑图像,减少锯齿状边缘.如果你是用了 Forward Rendering, 你可以在画质设置中起启用MSAA(docs.unity3d.com/Manual/class-QualitySettings.html),你也应该在Gear VR中启用它来提升效果.

Deferred Rendering,你可以用图像脚本(docs.unity3d.com/420/Documentation/Components/script-AntialiasingAsPostEffect.html)或看论坛上启用SMAA的例子:”https://github.com/Chman/SMAA-Unity”.


Textures

  一般情况下,可以用  Texture Atlasing (https://en.wikipedia.org/wiki/Texture_atlas)把场景中的贴图整合起来以尽可能的减少材质球数量.

我们也可以用MeshBaker (https://www.assetstore.unity3d.com/en/#!/content/5017)简化加快这一优化过程.Meshbaker可以用来烘焙纹理,网格,材质来优化游戏性能.

详见下面链接:

MeshBaker的视频教程(https://www.youtube.com/watch?v=9vZ8SfXOlpI)

Oculus渲染文档:(https://developer.oculus.com/documentation/intro-vr/latest/concepts/bp_app_rendering/)


Shaders

  尽量使用Basic着色器,Gear VR,推荐使用Mobile > Unlit (Supports Lightmap) shader”.

Fullscreen Effects

Fullscreen effects(docs.unity3d.com/Manual/comp-ImageEffects.html)是非常消耗资源的,GearVR上要尽可能避免使用.


Quality Settings

  Quality Settings(docs.unity3d.com/Manual/class-QualitySettings.html)决定项目中画质的各个方面,改变这些属性可以提高游戏性能,但是会牺牲视觉效果.


RenderScale

  VRSettings.renderScale(docs.unity3d.com/ScriptReference/VR.VRSettings-renderScale.html)渲染比将改变图像锐度,可以用来提高画质或者降低画质提升帧率.


Asynchronous Loading

  如果把游戏拆分成若干个单独的场景,在加载时,为了避免画面冻结导致恶心不适感,建议使用异步加载来载入下一个场景数据:SceneManager.LoadSceneAsync(docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html)


VR示例中的优化技术

  我们在示例项目中做了一些列优化确保示例项目在GearVRDK2上都能有很好的性能.我们选用了一种低面艺术风格,并只使用了几个基本颜色,使得项目能很流畅有很美丽.

  我们使用了Forward Rendering,并在Edit > Project Settings > Quality Settings 启用了4x MSAA.


 

让我们快速的看一下场景中用到的优化技术:


Menu 场景优化

  场景中我们使用低模资源,没有用实时光照,给菜单面板用了名为SeparableAlpha的自定义着色器,它允许单独设置透明通道,避免每一帧都用这个菜单自己的透明通道,减少了贴图文件大小.


Flyer场景优化

  我们使用了雾效确保小行星等物体很融合的进入到场景,并缩短了视距,减少了渲染物体数量.小行星用了很少的面,所以它可以用 Dynamic Batching,同样也创建了一个对象池(unity3d.com/es/learn/tutorials/modules/beginner/live-training-archive/object-pooling)处理激光,小行星物体和圆环,减少较耗费资源的实例化(docs.unity3d.com/ScriptReference/Object.Instantiate.html)的使用.

  在飞船上用了一个很小的颜色纹理用第二UV通道给Detail Map.这会节省贴图尺寸.


Maze 场景优化

  迷宫场景使用了烘焙光照贴图,特别是在移动设备上运行它会有很流畅的效果,否则它将是一个很简单的没有实时光照没有什么效果的场景.


Shooter180Shooter360场景优化

  和其它游戏一样,我们用了低模风格以及对象池(unity3d.com/es/learn/tutorials/modules/beginner/live-training-archive/object-pooling),同时对低顶点数的模型使用Dynamic Batching(docs.unity3d.com/Manual/DrawCallBatching.html).

  更多优化细节可以到Oculus网站查看:

https://developer.oculus.com/documentation/

http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/


原文:http://unity3d.com/learn/tutorials/topics/virtual-reality

四角钱 (XK) 翻译,转载请注明来自 http://blog.1vr.cn

 

如果您觉得这篇文章对您有帮助,给作者点儿辛苦费吧,作者会继续努力写出更好的文章。谢谢啦。金额不限哦

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引