Unity5中優化VR 應用的12個技巧

2021-07-22 02:02:49 字數 2458 閱讀 9116

vr應用比非vr應用需要更強的計算,效能優化是乙個很重要的任務。若目標平台是像gearvr這樣的手機裝置,優化就更重要了。

以下是一些應該試著了解的效能指標:

下面是一些簡單的技巧,用於滿足上述要求:

靜態批處理

場景中可能存在大量的靜態幾何體,例如牆體,椅子,燈光和從不移動的網格。在編輯器中將它們標記為靜態物件。為烘焙光照貼圖,請確保將其標記為靜態貼圖。不要讓每個物件都會導致一次繪製呼叫,而是把物件標記為可被組合成乙個網格的靜態物件。

靜態批處理有個關鍵要求:所有物件必須使用相同的材質。若靜態牆帶有木頭材質,靜態椅子帶有鐵材質,所有牆會被批量處理為一次繪製呼叫,椅子作為單獨網格進行另外的繪製呼叫。

紋理集如之前所說,每個材質引發一次繪製呼叫。直覺可能是木門和鐵椅子需要使用不同的材質,由於它們的紋理不同。然而,若使用相同的著色器,就可以用紋理集為它們建立共用的材質。紋理集就是乙個包含所有小紋理的大紋理。我們可以使用乙個材質載入乙個紋理,而非使用多個材質載入多次。每個物件可以對應到紋理集中不同座標的乙個紋理。

你可以的繪製管線中手動生成紋理集,但是juan sebastian的pro draw call optimizer工具非常有用。它可以生成紋理集,並且在替換新物件時不會搞混資源。

動態批處理

非靜態物件可以動態批處理為乙個單獨的繪製呼叫。我曾注意到該過程大量占用cpu且每幀都在計算,但這是乙個很好的優化。這只對使用相同材質且頂點數少於900的物件有效。使用紋理集為所有的動態物件建立乙個材質,就可以進行簡單的動態批處理啦。

lods(多細節層次)

lod組是改善效能的簡便方法。使用有多個lod的資源,並用低解析度的幾何體渲染離相機遠的物件。unity可以自動隨著相機臨近在各個lod間轉換。

填充率,過度繪製及裁剪

這是個值得關注的話題。減少過度繪製,最遠的物件最先繪製,隨後上面依次繪製更近的物件。這個在平均解析度為1080p的pc顯示器上沒什麼問題,但對於有極高解析度的vr和手機裝置來說問題就比較嚴重。大量的過度繪製組成了大量畫素從而影響填充率。紋理填充率是限制gpu效能的關鍵。

一些解決方案提供了遮擋剔除和視錐體剔除。視錐體剔除是指不渲染位於相機視錐體外的物件。不渲染看不到的物件!遮擋剔除是剔除被其它物件擋住的物件。比如,門後的房間可以被整體剔除。預設情況下,遮擋剔除是針對整個場景的,如果關卡設計得當甚至可以讓你剔除遊戲中的整個關卡。

lod組當然也可以裁剪離場景很遠的物件,進一步使填充率最小化。

關卡設計

若遊戲涉及到玩家從乙個房間移到另乙個房間,簡單的解決方法是乙個關卡包含整個遊戲。缺點在於記憶體的消耗。儘管每個房間中的各物件和材質都不可見,但其仍會被載入到記憶體中。將每個房間放置於單獨的關卡中,在**中智慧型的非同步載入關卡可以改善效能。

非同步載入

光照烘焙

關掉實時陰影!接受動態陰影的物件不會被批處理,這會導致嚴重的繪製呼叫。

在pc機上,使用單個實時方向光就可以實現很好的動態陰影效果。對於大多數現代的pc都可以提供逼真的逐畫素陰影。然而在移動平台,你需要烘焙光照而不是實時陰影,以高解析度烘焙光照結合軟硬陰影實現類似的效果。

陰影尤其是為了高效能的手機體驗,對於3d物件的陰影處理要使用傳統技巧。可以通過在物件下放置乙個簡單的帶有模糊陰影紋理的2d四邊形模擬半真實的陰影。

vr jam tip: don』t try to use shadow buffers. pre-light environments and use old-school blurry shadow blobs under characters.

— john carmack (@id_aa_carmack) april 26, 2015

例如,你hold不住像《gta v》中這種在高效能pc機上使用的實時動態陰影。

用如下方法代替:這是一張2023年《gta vice city》的遊戲截圖,你可以在playstation 2上使用陰影斑點來提供陰影效果的幻覺。

light probes(光照探針)

當使用烘培光照時,靜態物件效果不錯但動態物件還有不妥。對於動態物件可以使用光照探針來模擬簡單的動態光照。

光照探針是烘焙好的立方貼圖,儲存了場景中多個點直接、間接甚至自發光的資訊。當動態物件移動時,它在光照探測器附近進行插值獲取近似某個點的光照。這是一種在動態物件上模擬實時光照的簡便辦法,而不用成本高昂的實時光照。

unity的文件解釋了光照探針要如何放置。

避免使用透明和多個材質的物件

類似玻璃這種使用透明著色器的物件很消耗效能。使牆壁看起來更逼真的常見做法是,用乙個帶有灰塵或鏽斑紋理的透明材質,加上另乙個單獨的基本漫射材質。多材質的alpha混合是很消耗效能的,每個材質都會增加一次繪製呼叫!但是請注意:多個紋理並沒有問題,使用多個材質才耗費效能。使用乙個材質結合著色器來實現多紋理的alpha混合,而非使用多個單獨材質。

蒙皮網格渲染器

蒙皮網格渲染器常用於角色身上,它帶有動畫關節,可以使用物理(布娃娃)變或自定義動畫(走,跳等)來實現逼真的網格變形。

壞訊息是:蒙皮網格渲染器不支援批處理。對於每只眼睛,場景中各角色都會進行多次繪製呼叫。目前還沒什麼解決方案。

Unity5中優化VR 應用的12個技巧(移動端)

vr應用比非vr應用需要更強的計算,效能優化是乙個很重要的任務。若目標平台是像gearvr這樣的手機裝置,優化就更重要了。以下是一些應該試著了解的效能指標 下面是一些簡單的技巧,用於滿足上述要求 靜態批處理 場景中可能存在大量的靜態幾何體,例如牆體,椅子,燈光和從不移動的網格。在編輯器中將它們標記為...

技術流 Unity5中12個優化VR應用的技巧

vr應用比非vr應用需要更強的計算,效能優化是乙個很重要的任務。若目標平台是像gearvr這樣的手機裝置,優化就更重要了。以下是一些應該試著了解的效能指標 每只眼睛50次繪製呼叫。unity2018更精確地將其稱為setpass calls。場景中頂點數少於50k 100k且面數少於50 100k。...

Unity5的AssetBundle的一點使用心得

如果你覺得自己對assetbundle不熟悉,建議先看看另外一篇文章 先來說說關於舊版本的assetbundle的事情。在載入的時候,由於我們是預先記錄了各個資源的依賴關係,所以在載入某乙個資源的時候,先去儲存的檔案裡面查詢它的依賴關係,把所有用到的依賴資源都先載入一次,然後再載入它,就能完整的載入...