优化Unity中的VR
简介
为确保用户有极棒,无恶心的虚拟现实体验,而达到推荐帧率,优化是很关键的一个部分.因为现在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示例中的优化技术
我们在示例项目中做了一些列优化确保示例项目在GearVR和DK2上都能有很好的性能.我们选用了一种低面艺术风格,并只使用了几个基本颜色,使得项目能很流畅有很美丽.
我们使用了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 场景优化
迷宫场景使用了烘焙光照贴图,特别是在移动设备上运行它会有很流畅的效果,否则它将是一个很简单的没有实时光照没有什么效果的场景.
Shooter180和Shooter360场景优化
和其它游戏一样,我们用了低模风格以及对象池(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