【Unity優化】內存優化


IL2CPP 與 Mono

1)IL2CPP 優缺點

① 可以調試C++代碼

② 可以使用 Engine code stripping 減少代碼大小

③ 編譯慢

④ 只支持 AOT(Ahead of Time)

2)Mono優缺點

① 編譯快

② 支持JIT(Just In Time compilation)

3)現狀

① WebGL 和 UWP 只支持 IL2CPP

② iOS 因為要支持64位,需要用 IL2CPP

代碼剔除

1)代碼大小,直接影響硬盤和運行時內存空間占用。

2)托管代碼剔除

① Unity 在方法層級剔除托管代碼

② 可通過 Player Setting → Other Settings → Stripping Level,更改剔除層級

③ UnityLinker 從IL中剔除未使用的類型(class、structs等);如果類型被使用,還要剔除未使用的方法

④ 使用 Mono 時,是否剔除是可選的;使用 IL2CPP 時,強制開啟剔除

3)原生(本地/引擎)代碼剔除

① 通過 Player Setting → Strip Engine Code 開啟引擎代碼剔除

② 僅支持 iOS、WebGL、Android 平台

4)Unity模塊剔除:僅 WebGL 支持

5)C# 代碼剔除

① UnityLinker 使用“標記 → 剔除“原則,和垃圾回收類似。

② UnityLinker 將一些類型和方法標記為 root,然后遍歷他們的所有依賴關系。

③ 場景中,或 Resources 資源中用到的類,被標記為 root。

④ user assemblies 中的所有類型和方法,也被標記為 root。

⑤ 如果場景或某個資源,用到了其他程序集,則這些程序集也被標記為 root。

⑥ 還可以通過編輯 link.xml 文件,將其他類型或方法標記為 root。

⑦ 對於AB,使用 BuildPlayerOption.assetBundleManifestPath 標記額外的類型或方法標記為 root。

⑧ 將未使用的代碼編譯為程序集,方便剔除。

6)泛型共享

① IL2CPP 支持共享引用類型的泛型實現,減少代碼占用空間。

② IL2CPP 不支持共享值類型泛型,應減少使用

引擎代碼內存占用細節

1)引擎代碼大部分是常駐內存的,且通常無法控制和優化。

2)Unity使用不同的 allocator 和 buffer,有些是常駐的,有些是動態的。

3)Unity使用一個4MB大小的buffer pool存儲常量,每幀循環遍歷。該pool與GPU綁定

4)block allocator:分配一個新的塊內存頁,會產生內存和CPU負荷。通常Unity第一次使用某個系統,分配的塊內存是夠用的。分配完后重復利用。

5)AssetBundles:第一次加載AB時,需要 block allocator,然后復用。但是如果想要同時加載多個AB,則相應需要多個 block。

6)Resources:與其他系統共用 block allocator,在啟動時就已分配,因此加載資源時沒有相關負荷

7)Ringbuffer:Unity使用它推送紋理給GPU,通過 Quality.asyncUploadBufferSize 設置 ringbuffer 大小。

Assets

原生占用內存不被需要時,能夠被返回給操作系統。

一些減少 Assets 原生內存占用的方法:

① 移除 mesh 中不需要的 channel

② 移除動畫中的重復關鍵幀

③ 使用 Quality Settings → maxLOD,在打包時移除高細節網格

④ 打包后,檢查 Editor.log 文件,每個資源的內存占用是否正常

⑤ 使用 Quality Settings → Rendering → Texture Quality,通過 mipmap 強制降低紋理分辨率,減少向GPU傳輸的內存占用

⑥ 法線貼圖不需要和漫反射貼圖一樣大,使用低一些的分辨率不會影響質量。

9)材質克隆:使用材質的屬性將克隆返回一個新的材質;使用 shaderdMaterial 替代。

10)卸載場景:只卸載了GO,沒有卸載資源,需要使用 UnloadUnusedAssets 卸載。

音頻

1)Virtual Voices:Unity中遠而小的音頻使用 virtual;近而大的使用 real(不懂)

2)DSP Buffer Size:該設置影響延遲

3)音頻導入設置

① 如果不需要立體聲,開啟 Force to mono 選項,減少內存占用。

② 大段音頻應該使用 Streaming,占用200KB內存,因此200KB以下使用 Compressed;缺點是有一點延遲。

③ 長音頻如果沒有設置為 Steaming,可以設置為 Compressed,減少運行時內存。

④ 如果內存寬裕,使用 Decompress,提升CPU性能

4)音頻壓縮格式(Compression Format)選擇

① 非常短的音頻:設置為 ADPCM,壓縮比為3.5:1,解壓負荷低

② 安卓上的長音頻:使用 Vorbis;Unity不支持硬件加速解碼

③ iOS上的長音頻:使用 MP3 或 Vorbis

④ MP3 和 Vorbis 格式有一定解壓負荷,但是文件小。

⑤ MP3越高清,解壓負荷越小;中小清晰度的CPU負荷差不多。

⑥ 循環的音頻:推薦使用 Vorbis。MP3格式循環式可能會有短暫靜音(因為需要前置大小的數據塊,如果循環不是塊大小的整數倍,則會靜音等待)


免責聲明!

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



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