一、模型
導入模型選項:Import不需要的都不選;網格壓縮默認沒有,可以根據需要選擇壓縮層度;不會對網格寫入就不勾可讀寫
Rig頁面:勾選optimize game object,骨骼節點合並了。
動畫頁面,沒有動畫就不勾。有可以選動畫壓縮(但要注意壓縮關鍵幀會不會掉幀)
二、紋理
不要導出DDS格式的圖片,這個格式Unity無法壓縮。
勾選Mipmaps:一種圖形渲染技術,如果貼圖的基本尺寸是256x256像素的話,它mipmap就會有8個層級。每個層級是上一層級的四分之一的大小,依次層級大小就是:128x128;64x64;32x32;16x16;8x8;4x4;2x2;1x1(一個像素)。
紋理做成POT格式: NPOT且選擇Compress時,Unity會在安卓上會以16b進行壓縮、在iOS上則truecolor不壓縮。所以,需壓縮、或mipmap、或tiled的非打包單張紋理需強制POT。
壓縮選項選擇高質量:
三、UI
DrawCall:任何材質或shader發生改變,就會有一次DrawCall。一個MeshRender對應一個材質,多個MeshRender可以對應同一個Material,多個Material也可以共用一個Shader。
那么理論上,所有的MeshRender共用一個材質一個shader,發送一次DrawCall即可。
DrawCall優化:
- 使用圖集Atlas:多個精靈使用同一個材質同一張貼圖,那么CPU只需要發送一次DrawCall。保證圖集使用率最大化,原則上不超過1024*1024。
- 使用Unity的靜態和動態批處理:勾選static bathcing(批處理:通過合並把頂點坐標組建成一個整體),但是有限制:材質相同、mesh在300面以下。
九宮格:比較對稱的圖形,可以做小一點,用九宮格拉伸,而且不同規格不同大小的面板可以復用同一個資源。
圖集:UGUI會自動打包成圖集,而NGUI要先打包圖集。注意你的圖片不能放在Resources文件夾下面,Resources文件夾下的資源將不會被打入圖集。
四、場景打包
選擇LZ4壓縮。
==================================================================================
內存優化
Unity內存分配過程:檢查是否有足夠的內存單元來存儲數據,如果有則分配;如果沒有,GC釋放內存,釋放后有則分配;沒有則Unity會擴展堆的大小然后分配。
Unity兩個內存管理池:托管堆、堆棧
- 堆棧Stack:存儲較小的短暫的數據。
- 托管堆Heap:存儲較大的存儲時間較長的數據。
GC:將廢棄內存重新回收再次使用的過程。Unity會定時對堆內存進行GC操作。
GC分配過程:檢查堆內存中每個存儲變量 => 檢測變量引用是否激活狀態 => 沒激活則標記可回收 => 標記為可回收的變量被移除。
GC的缺點:執行流程消耗大量時間,導致游戲運行緩慢,幀率低;會使內存碎片化;
解決GC缺點的辦法:
- 減少new的次數
- 字符串拼接用StringBuilder而不是string
- new list時規定內存大小
- 射線檢測
- 使用靜態變量
- 枚舉代替常量字符串
- 不要在頻繁使用的函數中進行堆內存分配
API優化:
- transform.name GameObject.tag 會產生內存垃圾,使用CompareTag()替代。
- yield return null 代替 yield return 0,返回int會導致拆裝箱。