Unity效能優化 – 設定篇

語言: CN / TW / HK

想要做好Unity效能優化,主要從CPU,記憶體,GPU等多方面進行,需要處理好許多事情。在指令碼篇中我們就Unity API,C#,IL2CPP,Lua和演算法資料結構等多方面提出了效能優化建議。鑑於Unity內設定項繁多,如果某項設定不當,就可能會對效能造成負面影響。

本文將從紋理、模型、音訊等多方面進行討論,主要針對影響效能較大的設定項。

紋理

  • Read/Write Enable :如果你不需要執行時讀取圖片的畫素資訊的話, 禁用 ,否則啟用後紋理的記憶體消耗會增加一倍。
  • Generate Mip Maps :如果不是3D模型貼圖,則 禁用 ,否則會多出約33%的記憶體開銷。Mipmaps主要為遠處的物件生成較為清晰的小貼圖,減少渲染導致的畫質損失。像UI貼圖,則完全用不到。
  • Override for iOS/Android啟用 ,為特定平臺做差異化配置。
  • Max Size :視情況而定,預設最大貼圖尺寸限制為2048,如果是特效貼圖限制為512。
  • Format
  • iOS推薦使用ASTC,ASTC一般推薦 ASTC 6x6 ,如果清晰度達不到需求,可以設定為 ASTC 4x4 。注意:ASTC僅在iPhone 6以後的裝置被支援,如果需要支援iPhone 6之前的裝置,可以設定為 PVRTC
  • Android推薦使用ETC,如果是帶透明通道的,可選擇ETC2,注意:ETC2只在支援OpenGLES 3.0的裝置獲得支援,如果考慮舊裝置,則可以選用ETC,然後勾選 Split Alpha Channel 。如果不帶透明通道,則無腦選用ETC。
  • 我們可以在預覽的下方看到紋理的壓縮格式和實際佔用的記憶體大小,我們需要經常關注這項資訊,以觀察設定是否生效。

模型

  • Mesh Compression :壓縮比越高模型檔案越小,需要根據遊戲內的實際效果決定,一般可以設定為 Medium
  • Read/Write Enable :如果你不需要執行時修改模型的話, 禁用 ,否則啟用後模型的記憶體消耗會增加一倍。
  • Optimize Mesh :推薦啟用,可以提升GPU效能。
  • Normals :如果你的模型沒有法線資訊,將其設為 None ,可以減小模型大小。

Rig

  • Animation Type :如果你的模型沒有骨骼,將其設為 None
  • Optimize Game Objects啟用 ,可以將暴露在Hierarchy的子節點移除,極大的減少了模型的層級和Children數量,從而提升執行時效能。如果有掛載點需求,在 Extra Transforms to Expose 裡新增需要暴露的子節點即可。

Animation

  • Import Animation :如果你的模型沒有動畫,將其解除勾選。
  • Anim. Compression :推薦使用 Optimal ,經過測試 OptimalKeyframe Reduction 節省約50%的大小,從而可以提升載入速度。如果覺得動畫質量太差,則可以退回到 Keyframe Reduction 甚至到 Off

Materials

如果你不需要模型內的材質,解除 Import Materials 的勾選,否則會附帶一個預設的材質引用在模型裡。

音訊

音訊的效能開銷主要有兩點:記憶體開銷和CPU開銷。

關於記憶體開銷,我們可以通過最下方資訊裡的 Imported Size 來得知。

音訊設定中影響效能最大的兩個引數為 Load TypeCompression Format

其中 Load Type 有三種類型:

Decompress On Load
Compressed In Memory
Streaming

Compression Format 主要也可以分為三種類型:

  • PCM :完全不壓縮格式,佔據的硬碟和記憶體相對會較大,由於執行時不需要解壓,所以它的CPU開銷最小。
  • ADPCM :一種古老的壓縮格式,相對於 PCM 的壓縮比為 3.5:1 ,但是執行時的解壓開銷很小,對於音質有一定損耗。
  • Vorbis/MP3 :常見的壓縮格式,主流平臺全部支援的格式,壓縮比較高,但是執行時的解壓縮開銷較大,對於音質的損耗更加嚴重。在iOS平臺上一般設定為 MP3 ,因為iOS支援 MP3 格式的硬解碼。

那麼對於音訊檔案我們應該如何設定?

我的建議是:

  • 對於背景音樂,採用 Compressed In Memory + Vorbis/MP3 ,因為背景音樂通常較大較長,所以記憶體開銷就會比較大,這時候我們應該優先關注記憶體,同時也要使CPU開銷沒有 Streaming 那麼大。
  • 對於時長較短且頻繁播放的音效,比如按鈕點選音效,採用 Decompress On Load + PCM ,因為非常短的音效檔案很小,所以記憶體開銷就不那麼關鍵,可能由於要播放多次,這時候CPU開銷就很關鍵。
  • 對於一般的音效,採用 Compressed In Memory + ADPCM ,你需要去試聽其效果,如果覺得 ADPCM 失真太嚴重,可以將其換成 PCM

其他

Quality Settings

  • Texture Quality :貼圖質量,可以選擇 Half Res ,這樣速度會更快,但是貼圖質量會輕微下降。
  • Shadows :建議禁用,Unity內的影子開銷很大,可以用貼圖來實現粗糙的陰影,也可以自己 用Shader實現 ,影子的模型可以利用減面工具來減面,譬如 Simpolygon
  • V Sync Count :建議設定為 Don't Sync ,否則無法自行在遊戲內控制幀率。有些時候在靜態UI較多的介面,可以將幀率適當降低,以達到減少發熱量和耗電量的目的。
  • Async Upload :建議在Loading時,將 Async Upload Time Slice 調大成4ms或者8ms,將 Async Upload Buffer Size 調高到16MB,以加速資源上傳。具體可以參考: 優化載入效能:瞭解非同步上傳管線AUP

Player Settings

  • Scripting Backend :選 IL2CPP ,IL2CPP經過幾年的不斷完善,已經非常穩定,轉成C++程式碼後效能得到提升,同時也變相提供了對C#程式碼的混淆。
  • C++ Compiler Configuration :預設選擇 Release ,如果出上線包的話,推薦改成 Master ,這樣雖然打包速度會慢一點,但是編譯的C++程式碼會更加優化一些。

  • Prebake Collision Meshes啟用 ,用構建的時間換執行時的效能。
  • Keep Loaded Shaders Alive啟用 ,因為Shader的載入和解析很耗時,所以不希望Shader被解除安裝。
  • Managed Stripping Level :如果專案比較簡單,可以嘗試 High ,這樣可以降低一些包大小。如果專案比較龐大,則需要酌情考慮,因為 HighMedium 可能會導致報錯或者閃退。
  • Optimaze Mesh Data啟用 ,減少不必要的Mesh資料,降低包大小。

* 安卓有個 Blit Type 的選項,如果你的 Color Space 不是 Linear (Linear空間會比Gamma空間開銷更大,但是顯示效果更好),則可以將其設為 Never ,這樣可以 減少額外的一次Blit而提升效能

參考資料