UNITY开发VR眼镜中文入门教程(7)

优化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模式查看场景中的覆盖情况.

1_overdraw-menu

普通视图模式:

2_normal-shaded

Overdraw 模式:

3_overdraw

Level of Detail

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

4_lod0

 

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)能禁止对看不到的场景渲染,例如一扇门关闭时,我们不想让门那边的另外房间渲染,就可以使用它.使用它可以显著提升性能.

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

6_occlusionfrustumculling

使用了遮挡裁切的示例:

7_occlusionfullculling

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.

8_msaa-qualitysettings

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注