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