Unity:資源優化和內存優化


一、模型

導入模型選項: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會導致拆裝箱。


免責聲明!

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



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