菜鳥在線分享Unity5中優化VR 應用的12個技巧(轉載)
VR應用比非VR應用需要更強的計算,性能優化是一個很重要的任務。若目標平臺是像GearVR這樣的手機設備,優化就更重要了。
以下是一些應該試著了解的性能指標:
每只眼睛50次繪制調用。Unity5更精確地將其稱為SetPass Calls。
場景中頂點數少于50K~100K 且面數少于50~100K 。
下面是一些簡單的技巧,用于滿足上述要求:
靜態批處理場景中可能存在大量的靜態幾何體,例如墻體,椅子,燈光和從不移動的網格。在編輯器中將它們標記為靜態對象。為烘焙光照貼圖,請確保將其標記為靜態貼圖。不要讓每個對象都會導致一次繪制調用,而是把對象標記為可被組合成一個網格的靜態對象。
靜態批處理有個關鍵要求:所有對象必須使用相同的材質。若靜態墻帶有木頭材質,靜態椅子帶有鐵材質,所有墻會被批量處理為一次繪制調用,椅子作為單獨網格進行另外的繪制調用。
紋理集如之前所說,每個材質引發一次繪制調用。直覺可能是木門和鐵椅子需要使用不同的材質,由于它們的紋理不同。然而,若使用相同的著色器,就可以用紋理集為它們創建共用的材質。紋理集就是一個包含所有小紋理的大紋理。我們可以使用一個材質加載一個紋理,而非使用多個材質加載多次。每個對象可以對應到紋理集中不同坐標的一個紋理。
你可以在繪制管線中手動生成紋理集,但是Juan Sebastian的Pro Draw Call Optimizer工具非常有用。它可以生成紋理集,并且在替換新對象時不會搞混資源。
動態批處理非靜態對象可以動態批處理為一個單獨的繪制調用。我曾注意到該過程大量占用CPU且每幀都在計算,但這是一個很好的優化。這只對使用相同材質且頂點數少于900的對象有效。使用紋理集為所有的動態對象創建一個材質,就可以進行簡單的動態批處理啦。
LODs(多細節層次)LOD組是改善性能的簡便方法。使用有多個LOD的資源,并用低分辨率的幾何體渲染離相機遠的對象。Unity可以自動隨著相機臨近在各個LOD間轉換。
填充率,過度繪制及裁剪這是個值得關注的話題。減少過度繪制,最遠的對象最先繪制,隨后上面依次繪制更近的對象。這個在平均分辨率為1080P的PC顯示器上沒什么問題,但對于有極高分辨率的VR和手機設備來說問題就比較嚴重。大量的過度繪制組成了大量像素從而影響填充率。紋理填充率是限制GPU性能的關鍵。
一些解決方案提供了遮擋剔除和視錐體剔除。視錐體剔除是指不渲染位于相機視錐體外的對象。不渲染看不到的對象!遮擋剔除是剔除被其它對象擋住的對象。比如,門后的房間可以被整體剔除。默認情況下,遮擋剔除是針對整個場景的,如果關卡設計得當甚至可以讓你剔除游戲中的整個關卡。
LOD組當然也可以裁剪離場景很遠的對象,進一步使填充率最小化。
關卡設計若游戲涉及到玩家從一個房間移到另一個房間,簡單的解決方法是一個關卡包含整個游戲。缺點在于內存的消耗。盡管每個房間中的各對象和材質都不可見,但其仍會被加載到內存中。將每個房間放置于單獨的關卡中,在代碼中智能的異步加載關卡可以改善性能。
異步加載在玩家即將進入下個房間之前,加載下一個關卡。不要使用Application.LoadLevel()同步加載,因為加載時會導致游戲掛起。由于頭盔的跟蹤是實時的,這會導致眩暈,對玩家來說體驗太糟糕。
使用Application.LoadLevelAsync()來加載關卡。你可以在Oculus Mobile SDK BlockSplosion例子的StartupSample.cs中找到使用方法。
光照烘焙關掉實時陰影!接受動態陰影的對象不會被批處理,這會導致嚴重的繪制調用。
在PC機上,使用單個實時方向光就可以實現很好的動態陰影效果。對于大多數現代的PC都可以提供逼真的逐像素陰影。然而在移動平臺,你需要烘焙光照而不是實時陰影,以高分辨率烘焙光照結合軟硬陰影實現類似的效果。
陰影尤其是為了高性能的手機體驗,對于3D對象的陰影處理要使用傳統技巧。可以通過在對象下放置一個簡單的帶有模糊陰影紋理的2D四邊形模擬半真實的陰影。
VR小提示:不要嘗試使用陰影緩沖。預處理光照環境并在角色下方使用老套的模糊陰影紋理處理方法。
Light Probes(光照探針)當使用烘培光照時,靜態對象效果不錯但動態對象還有不妥。對于動態對象可以使用光照探針來模擬簡單的動態光照。
光照探針是烘焙好的立方貼圖,存儲了場景中多個點直接、間接甚至自發光的信息。當動態對象移動時,它在光照探測器附近進行插值獲取近似某個點的光照。這是一種在動態對象上模擬實時光照的簡便辦法,而不用成本高昂的實時光照。
Unity的文檔解釋了光照探針要如何放置。
避免使用透明和多個材質的對象類似玻璃這種使用透明著色器的對象很消耗性能。使墻壁看起來更逼真的常見做法是,用一個帶有灰塵或銹斑紋理的透明材質,加上另一個單獨的基本漫射材質。多材質的alpha混合是很消耗性能的,每個材質都會增加一次繪制調用!但是請注意:多個紋理并沒有問題,使用多個材質才耗費性能。使用一個材質結合著色器來實現多紋理的alpha混合,而非使用多個單獨材質。
蒙皮網格渲染器蒙皮網格渲染器常用于角色身上,它帶有動畫關節,可以使用物理(布娃娃)變或自定義動畫(走,跳等)來實現逼真的網格變形。
壞消息是:蒙皮網格渲染器不支持批處理。對于每只眼睛,場景中各角色都會進行多次繪制調用。目前還沒什么解決方案。