Unity VR游戏开发干货教程:优化VR体验
簡介
對于VR應用來說,如果想要讓用戶獲得好的用戶體驗,特別是免除惡心眩暈的困擾,在VR開發中進行優化是必不可少的,惟其如此才能達到我們期望的游戲運行幀速。和其它平臺上的開發不同,對VR應用的優化應該在項目啟動的前期就開始,而且應該貫穿始終,而不是像傳統項目那樣把優化的工作留到最后去做。此外,在目標設備上進行實際測試也是非常有必要的。
相比非VR項目來說,VR項目是非常消耗計算資源的,其主要原因就是所有的畫面都必須為每只眼睛單獨渲染一次。因此,在開發VR應用的過程中需要時刻想到這些問題。如果我們能在開啟之前就想到這些問題,那么會節省大量的時間。
對于移動VR來說,優化工作就顯得尤為重要。不僅僅是因為要運行VR應用,還因為移動設備的運算性能和散熱性相比桌面電腦來說都要差上不少。
考慮到實現目標幀速是如此重要,所有的優化方法都必須考慮在內。我們需要在所有可能的地方優化項目代碼,關于優化代碼,可以參考Unity的Unity - Manual: Optimizing Scripts。
Oculus的相關資源
在Oculus的官方網站上提供了大量關于如何優化VR應用的信息。
Unity Editor優化工具
Unity提供了一系列有用的工具和方法,可以幫助我們來優化VR內容。
The Profiler
profiler可以幫助開發者了解游戲中渲染每一幀所耗費的時間,并將其分為CPU、渲染、內存、音頻、物理引擎和網絡。學會如何使用Profiler對于檢測游戲運行性能是至關重要的。
Frame Debugger
使用Frame Debugger可以讓我們凍結某一幀,然后通過單獨的draw調用來查看場景是如何生成的,然后來發現需要進行優化的地方。在這個過程中,我們可能會發現渲染了一些不必要進行渲染的對象,這樣可以大幅度降低每幀的draw 調用。
VR應用優化的基礎知識
考慮到對應用進行優化是個龐大的話題,對不同的平臺有不同的要求,我們也提供了延伸閱讀的相關信息。
通常來收,現有應用的優化技巧對VR開發也是適用的,因此這些知識也用得上。
Geometry(幾何體)
在VR應用我們應盡量刪除幾何體中用戶永遠也不會注意到的面。我們沒必要在場景中渲染出用戶根本看不到的東西。比如,如果某個杯子背靠著墻壁,那么用戶可能永遠也不會看到它的背面,因此我們可以不必顯示模型中的這些面。
對于3D美術設計人員,應該盡可能的簡化模型設計。根據目標平臺的不同,我們可能會需要查看紋理細節,或許還會希望查看視差映射貼圖,和曲面細分。雖然這種方法可能會影響游戲性能,也可能對特定的平臺根本無法使用。
Overdraw
Overdraw可以讓開發者查看哪些對象繪制在其它對象的頂部,但其實是在浪費GPU時間。我們應盡可能的減少使用overdraw。我們可以使用Scene View Control Bar來查看場景視圖中的overdraw。
?
正常的著色視圖如下:
?
啟用Overdraw之后的著色視圖:
?
Level of Detail(LOD)細節層次
通過使用LOD,可以隨著物體和攝像機之間的距離來減少物體渲染的三角形數目。除非所有的物體都離攝像機同樣遠,否則我們都可以使用LOD來減少硬件的負擔。我們可以添加一個LOD組件,然后對遠離攝像機的物體提供低精度模型。
?
使用Simplygon可以自動完成對大多數asset的LOD預處理。
Draw Call 批處理
我們應盡可能的通過Static Batching和Dynamic Batching來實現Draw Call 批處理。Draw Call批處理可以極大的提升游戲性能。具體請參考Unity官方指南的Draw Call Batching(。
Light mapping
盡可能減少動態光照,盡量多使用光照烘焙,盡量避免實時陰影。
關于這部分的具體內容,請參考Unity官方的Lighting and Rendering(Unity - Unity 5。
Light Probes
使用Light probes可以讓我們對場景中的光照點取樣,然后應用到動態物體上。使用light probes通常更快,而且也能產生絕佳的視覺效果。
Reflection Probes
Reflection probes可以保存其周圍的立方圖,從而實現真實反射效果,而且也會對游戲性能產生影響。需要注意的是,目前在VR中使用實時reflection probes會導致游戲性能大幅降低。
Occlusion Culling
Occlusion Culling(遮擋剔除)可以避免渲染那些不可見的物體。例如,如果玩家正處于某個房間中,而另外一個房間的門是關閉的,那么對玩家來說另外一個房間中的所有物體都是不可見的,也就完全沒必要進行渲染。
根據項目和目標平臺的不同,我們可能會希望實現Occlusion Culling,從而大幅提升手游購買平臺游戲性能。
下圖是一個frustum culling(視錐體剔除)的示例:
下圖是Occlusion Culling(遮擋剔除)的示例:
?
Anti-Aliasing(抗鋸齒)
抗鋸齒對VR應用來說非常重要,因為使用這種技術可以讓圖像的邊緣顯得更加平滑,并減少毛邊線下。如果我們在項目中使用Forward Rendering,那么就需要在Quality Setting中啟用MSAA。而對于Gear VR項目來說,任何時候我們都需要啟用該選項。
當然,在使用Deferred Rendering時我們無法啟用MSAA,此時需要啟用AntiAliasing作為后處理特效(所謂的“反走樣”),或者考慮使用SMAA。
這里提供了一個相關的示例。
GitHub - Chman/SMAA-Unity: A highly customizable implementation of Subpixel Morphological Antialiasing for Unity3D.?
Textures
通常來說,在VR項目中我們應盡可能的使用Texture Atlasing(紋理貼圖),以減少單獨紋理和材質的使用量。
為簡化和加速這個過程,我們可以考慮使用MeshBaker來烘焙游戲中所使用的紋理、模型和材質。
在Oculus Connect 2開發者大會上,來自Turbo Button的Holden曾分享過優化應用以及使用MeshBaker的相關經驗。
有一點需要注意的是,在VR項目中normal maps看起來效果并不好,因此我們應該避免使用。)。
Shaders
在VR項目中,我們應盡可能使用最基本的shader。在Gear VR上,我們可能會需要考慮使用不那么消耗資源的Mobile>Unlit(Supports Lightmap) shader,并使用lightmap來給場景提供光照。
Fullscreen Effects(全屏特效)
對VR項目來說Fullscreen Effects過于奢侈,因此我們應在Gear VR項目中完全避免使用。
Quality Settings
Quality Settings中的選項將直接影響項目的視覺效果。通過調整這些屬性,可以某種程度的提升游戲性能,當然代價就是犧牲了部分視覺效果。
RenderScale
調整VRSetting.renderScale可以犧牲畫質換取更高的游戲性能。具體可以參考本系列教程的第二篇。
Asynchronous Loading
為了提升性能,我們可以考慮把游戲場景分成諸多小的場景。不過這樣做需要注意的是,在加載下一個場景的內容時,應該避免鎖定對頭部的跟蹤,以免產生nausea惡心現象。
為避免出現這種情況,我們可以考慮設計一個允許頭部運動跟蹤的加載場景,讓游戲異步加載新的場景,具體的方法是使用SceneManager.LoadSceneAsync。
示例場景中所用到的優化技巧
為了讓用戶在DK2和Gear VR上面獲得更好的體驗,我們在示例場景中使用了一系列的優化技巧。
考慮到我們需要讓同一個項目支持兩個憑條,因此需要考慮對最低端性能設備的支持,也就是Gear VR。我們選擇了低多邊形的藝術風格,并使用少量的基本色彩,讓物體從環境中脫穎而出。
在使用Forward Rendering時,我們需要在Edit > Project Settings > Quality Settings 中啟用4x MSAA,以便獲得更好的視覺效果:
?
讓我們簡單看看這些場景中所使用的優化技術:
Menu 場景中使用的優化技術:
跟該項目中所有的場景一樣,Menu場景中使用了低多邊形的美術資源,而且避免使用實時光照。
我們在菜單面板上使用了定制的shader,名為SeparableAlpha,可以為一系列的圖像定義獨立的alpha通道。這就意味著不是每一幀都需要自己的alpha通道。這樣做可以節省文件大小,并去掉某些貼圖。
Flyer 場景中使用的優化技術:
我們在Flyer場景中動態啟用了fog,從而避免讓物體突然跳進玩家的視野,并縮短了視距,這也就意味著減少了所需渲染的物體數量。
場景中隕石的頂點數較低,從而可以通過Dynamic Batching來減少draw call。
為了重用某些物體,我們創建了一個對象池,以處理激光、隕石和星門這樣的對象。通過這種方式,可以避免昂貴的初始化調用。
對于Flyer場景中的飛船紋理我們同樣做了優化,通過使用Detail Map slot中的次級UV 通道,可以只需使用更少的色塊。這樣一來我們就可以縮減總體的紋理大小。
Maze場景中的優化技術
Maze場景中使用了lightmap,從而在運行時獲得更好的性能,特別是在Gear VR上。除此之外,該場景沒有任何的實時光照和特效。
Shooter180(Target Gallery)和Shooter360(Target Arena)中的場景優化
和其它游戲一樣,我們在這些場景中沿用了低多邊形風格,并為目標對象創建了object pooling。同時我們使用了低頂點數以啟用Dymaic Batching。
看完本篇教程,大家對VR游戲優化應該有了整體的印象,也大概了解了我們應如何使用Unity內置的工具來分析游戲性能,以及如何通過某些技巧來獲得更好的游戲表現。
總結
以上是生活随笔為你收集整理的Unity VR游戏开发干货教程:优化VR体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏设计模式思考:“穿越火线”中的“策略
- 下一篇: 游戏性能优化技术干货分享——内存管理