Unity5.3官方VR教程重磅登場-系列7 優化VR體驗


本文轉自:知乎專欄-笨貓快樂學編程,作者:王寒

簡介

對於VR應用來說,如果想要讓用戶獲得好的用戶體驗,特別是免除惡心眩暈的困擾,在VR開發中進行優化是必不可少的,惟其如此才能達到我們期望的游戲運行幀速。和其它平台上的開發不同,對VR應用的優化應該在項目啟動的前期就開始,而且應該貫穿始終,而不是像傳統項目那樣把優化的工作留到最后去做。此外,在目標設備上進行實際測試也是非常有必要的。

相比非VR項目來說,VR項目是非常消耗計算資源的,其主要原因就是所有的畫面都必須為每只眼睛單獨渲染一次。因此,在開發VR應用的過程中需要時刻想到這些問題。如果我們能在開啟之前就想到這些問題,那么會節省大量的時間。

對於移動VR來說,優化工作就顯得尤為重要。不僅僅是因為要運行VR應用,還因為移動設備的運算性能和散熱性相比桌面電腦來說都要差上不少。

考慮到實現目標幀速是如此重要,所有的優化方法都必須考慮在內。我們需要在所有可能的地方優化項目代碼,關於優化代碼,可以參考Unity的Unity – Manual: Optimizing Scripts

Oculus的相關資源

在Oculus的官方網站上提供了大量關於如何優化VR應用的信息,在閱讀我們的教程之前,強烈建議大家仔細閱讀這些文檔。

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 Editor優化工具

Unity提供了一系列有用的工具和方法,可以幫助我們來優化VR內容。

The Profiler

profiler可以幫助開發者了解游戲中渲染每一幀所耗費的時間,並將其分為CPU、渲染、內存、音頻、物理引擎和網絡。學會如何使用Profiler對於檢測游戲運行性能是至關重要的。

關於Profiler的相關信息,可以參考以下鏈接:

Unity – Manual: Profiler

Unity – Profiler Overview for Beginners

Unity – Introduction to the Profiler

Frame Debugger

使用Frame Debugger可以讓我們凍結某一幀,然后通過單獨的draw調用來查看場景是如何生成的,然后來發現需要進行優化的地方。在這個過程中,我們可能會發現渲染了一些不必要進行渲染的對象,這樣可以大幅度降低每幀的draw 調用。

關於使用Frame Debugger的更多信息,請參考這里:

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

Unity – Frame Debugger

VR應用優化的基礎知識

考慮到對應用進行優化是個龐大的話題,對不同的平台有不同的要求,我們也提供了延伸閱讀的相關信息。

通常來收,現有應用的優化技巧對VR開發也是適用的,因此這些知識也用得上。

Geometry(幾何體)

在VR應用我們應盡量刪除幾何體中用戶永遠也不會注意到的面。我們沒必要在場景中渲染出用戶根本看不到的東西。比如,如果某個杯子背靠着牆壁,那么用戶可能永遠也不會看到它的背面,因此我們可以不必顯示模型中的這些面。

對於3D美術設計人員,應該盡可能的簡化模型設計。根據目標平台的不同,我們可能會需要查看紋理細節,或許還會希望查看視差映射貼圖,和曲面細分。雖然這種方法可能會影響游戲性能,也可能對特定的平台根本無法使用。

Overdraw

Overdraw可以讓開發者查看哪些對象繪制在其它對象的頂部,但其實是在浪費GPU時間。我們應盡可能的減少使用overdraw。我們可以使用Scene View Control Bar(Unity – Manual: Scene View Control Bar)來查看場景視圖中的overdraw。

1204939957.png

正常的着色視圖如下:

912105436.jpg

啟用Overdraw之后的着色視圖:

1648310640.jpg

Level of Detail(LOD)細節層次

通過使用LOD,可以隨着物體和攝像機之間的距離來減少物體渲染的三角形數目。除非所有的物體都離攝像機同樣遠,否則我們都可以使用LOD來減少硬件的負擔。我們可以添加一個LOD組件,然后對遠離攝像機的物體提供低精度模型。

152476235.png

27aa00184749d846dd78e492880525a1_b.jpg

使用Simplygon(Asset Store)可以自動完成對大多數asset的LOD預處理。

Draw Call 批處理

我們應盡可能的通過Static Batching和Dynamic Batching來實現Draw Call 批處理。Draw Call批處理可以極大的提升游戲性能。具體請參考Unity官方指南的Draw Call Batching(Unity – Manual: Draw Call Batching)。

Light mapping

盡可能減少動態光照,盡量多使用光照烘焙,盡量避免實時陰影。

關於這部分的具體內容,請參考Unity官方的Lighting and Rendering(Unity – Unity 5)。

Light Probes

使用Light probes(Unity – Manual: Light Probes)可以讓我們對場景中的光照點取樣,然后應用到動態物體上。使用light probes通常更快,而且也能產生絕佳的視覺效果。

Reflection Probes

Reflection probes(Unity – Manual: Reflection Probe)可以保存其周圍的立方圖,從而實現真實反射效果,而且也會對游戲性能產生影響。需要注意的是,目前在VR中使用實時reflection probes會導致游戲性能大幅降低。

Occlusion Culling

Occlusion Culling(遮擋剔除)可以避免渲染那些不可見的物體。例如,如果玩家正處於某個房間中,而另外一個房間的門是關閉的,那么對玩家來說另外一個房間中的所有物體都是不可見的,也就完全沒必要進行渲染。

根據項目和目標平台的不同,我們可能會希望實現Occlusion Culling,從而大幅提升游戲性能。

下圖是一個frustum culling(視錐體剔除)的示例:

641604320.jpg

下圖是Occlusion Culling(遮擋剔除)的示例:

740010033.jpg

Anti-Aliasing(抗鋸齒)

抗鋸齒對VR應用來說非常重要,因為使用這種技術可以讓圖像的邊緣顯得更加平滑,並減少毛邊線下。如果我們在項目中使用Forward Rendering,那么就需要在Quality Setting中啟用MSAA(Unity – Manual: Quality Settings)。而對於Gear VR項目來說,任何時候我們都需要啟用該選項。

當然,在使用Deferred Rendering時我們無法啟用MSAA,此時需要啟用AntiAliasing作為后處理特效(所謂的“反走樣”,Asset Store),或者考慮使用SMAA。

這里提供了一個相關的示例。

GitHub – Chman/SMAA-Unity: A highly customizable implementation of Subpixel Morphological Antialiasing for Unity3D.

Textures

通常來說,在VR項目中我們應盡可能的使用Texture Atlasing(紋理貼圖,Texture atlas),以減少單獨紋理和材質的使用量。

為簡化和加速這個過程,我們可以考慮使用MeshBaker(Asset Store)來烘焙游戲中所使用的紋理、模型和材質。

在Oculus Connect 2開發者大會上,來自Turbo Button的Holden曾分享過優化應用以及使用MeshBaker的相關經驗(視頻)。

有一點需要注意的是,在VR項目中normal maps看起來效果並不好,因此我們應該避免使用。關於紋理的更多知識,請參考Oculus documents

Shaders

在VR項目中,我們應盡可能使用最基本的shader。在Gear VR上,我們可能會需要考慮使用不那么消耗資源的Mobile>Unlit(Supports Lightmap) shader,並使用lightmap來給場景提供光照。

Fullscreen Effects(全屏特效)

對VR項目來說Fullscreen Effects(Unity – Manual: Image Effect Reference)過於奢侈,因此我們應在Gear VR項目中完全避免使用。

Quality Settings

Quality Settings(Unity – Manual: Quality Settings)中的選項將直接影響項目的視覺效果。通過調整這些屬性,可以某種程度的提升游戲性能,當然代價就是犧牲了部分視覺效果。

RenderScale

調整VRSetting.renderScale(Unity – Scripting API:)可以犧牲畫質換取更高的游戲性能。具體可以參考本系列教程的第二篇。

Asynchronous Loading

為了提升性能,我們可以考慮把游戲場景分成諸多小的場景。不過這樣做需要注意的是,在加載下一個場景的內容時,應該避免鎖定對頭部的跟蹤,以免產生nausea惡心現象。

為避免出現這種情況,我們可以考慮設計一個允許頭部運動跟蹤的加載場景,讓游戲異步加載新的場景,具體的方法是使用SceneManager.LoadSceneAsync(Unity – Scripting API:)。

示例場景中所用到的優化技巧

為了讓用戶在DK2和Gear VR上面獲得更好的體驗,我們在示例場景中使用了一系列的優化技巧。

考慮到我們需要讓同一個項目支持兩個憑條,因此需要考慮對最低端性能設備的支持,也就是Gear VR。我們選擇了低多邊形的藝術風格,並使用少量的基本色彩,讓物體從環境中脫穎而出。

在使用Forward Rendering時,我們需要在Edit > Project Settings > Quality Settings 中啟用4x MSAA,(Unity – Manual: Quality Settings)以便獲得更好的視覺效果:

讓我們簡單看看這些場景中所使用的優化技術:

Menu 場景中使用的優化技術:

跟該項目中所有的場景一樣,Menu場景中使用了低多邊形的美術資源,而且避免使用實時光照。

我們在菜單面板上使用了定制的shader,名為SeparableAlpha,可以為一系列的圖像定義獨立的alpha通道。這就意味着不是每一幀都需要自己的alpha通道。這樣做可以節省文件大小,並去掉某些貼圖。

Flyer 場景中使用的優化技術:

我們在Flyer場景中動態啟用了fog(Unity – Scripting API:),從而避免讓物體突然跳進玩家的視野,並縮短了視距,這也就意味着減少了所需渲染的物體數量。

場景中隕石的頂點數較低,從而可以通過Dynamic Batching(Unity – Manual: Draw Call Batching)來減少draw call。

為了重用某些物體,我們創建了一個對象池(Unity – Object Pooling),以處理激光、隕石和星門這樣的對象。通過這種方式,可以避免昂貴的初始化調用(Unity – Scripting API:)。

對於Flyer場景中的飛船紋理我們同樣做了優化,通過使用Detail Map slot中的次級UV 通道,可以只需使用更少的色塊。這樣一來我們就可以縮減總體的紋理大小。

Maze場景中的優化技術

Maze場景中使用了lightmap,從而在運行時獲得更好的性能,特別是在Gear VR上。除此之外,該場景沒有任何的實時光照和特效。

Shooter180(Target Gallery)和Shooter360(Target Arena)中的場景優化

和其它游戲一樣,我們在這些場景中沿用了低多邊形風格,並為目標對象創建了object pooling。同時我們使用了低頂點數以啟用Dymaic Batching(Unity – Manual: Draw Call Batching)。

看完本篇教程,大家對VR游戲優化應該有了整體的印象,也大概了解了我們應如何使用Unity內置的工具來分析游戲性能,以及如何通過某些技巧來獲得更好的游戲表現。

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/

在教程的最后一部分,我們將提供一系列的參考資料,供大家深入學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM