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格式循環式可能會有短暫靜音(因為需要前置大小的數據塊,如果循環不是塊大小的整數倍,則會靜音等待)