優化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/doc ... s/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)
聯系方式:0755-81699111
課程網址: http://www.vrkuo.com/course/vr.html