1. 程式人生 > >學習筆記——Unity3D記憶體優化(貼圖優化)

學習筆記——Unity3D記憶體優化(貼圖優化)

要學會如何優化Unity3D的貼圖,首先要了解Unity3D圖片上的各項設定大概是幹嘛的,修改之後會導致什麼樣的變化。另外,貼圖資源在Unity3D中佔用的記憶體大小不等於檔案本身的大小,而是與貼圖資源的設定有關,不論你放入的是PNG,PSD還是TGA,它們都會被自動轉換成Unity自己的Texture2D格式。我在遊戲開發中常用的圖片格式就是jpg和png,jpg 格式是有失真壓縮 檔案小 不支援透明,png:是無失真壓縮,檔案小,支援透明。

可以看到,這張圖片在Unity3D編輯器下大小為2.6M                                                   

而實際檔案大小為342KB

同樣的設定則只與貼圖寬高尺寸有關,與資源原始檔案格式無關。因為資源載入後佔用記憶體的大小與安裝包打包前資源大小是一致的,所以減小安裝包的大小也就是減少貼圖資源佔用記憶體的大小。

1.通常為了優化DrawCall,我們會把同一個UI介面上的圖片放進一個圖集裡。Unity3D的圖集長寬只會是2的冪次方,比如256*128,512*512等,而且圖集佔用記憶體的大小隻和它的壓縮格式與長寬有關,與圖集裡圖片的數量多少無關;Unity3D會根據圖集內的圖片大小自動調整圖集大小,如果有新的圖片放入圖集中,Unity3D會調整圖集中所有圖片的位置,給新的圖片騰出一塊地方放進去,當無論如何調整都放不下這張新圖片時,Unity3D就會給圖片們換個合適的大房子,此時圖集佔用的記憶體就會翻倍了。所以我們應該儘可能的讓一張圖集放入最多的圖片,不浪費圖集上的每一塊地方。圖集大小要控制在1024*1024以內,因為超過1024*1024的圖集佔用的記憶體會非常大,而且通常會導致一些不必要的記憶體佔用。因此過大的背景圖可以讓美術切成多個塊打包到圖集中,然後自己在Unity3D中拼接起來,例如下面這張圖集:

很明顯,這張圖集有將近三分之一是空的,也就是說,有三分之一記憶體浪費掉了,拆成兩張圖集後。總記憶體佔用九減少了0.5M

2.針對不同的平臺,不同的貼圖資源,結合實際需求,可以選擇不同的壓縮格式,能大大減少記憶體的佔用。在專案中,儘可能是使用ETC1和PVRTV4等GPU直接支援的圖片格式,不僅記憶體佔用低、效能也更好;當出現質量不及格時,再逐步的提升壓縮格式,來滿足需要。使用ECT1和PVRTC4 格式壓縮,一張1120*600的貼圖,會被處理成1024*512,而且轉換過程較慢,浪費效能,也會導致圖片失真,所以我們應該提前將貼圖資源轉化為符合標準的圖片。

該錶轉自:

https://zhuanlan.zhihu.com/p/25205686

如果原圖不是2的冪次方,可以在advance設定Non Power of 2值,

ToNearest :轉換成距離該圖片最近的2的冪次方值。
ToLarger : 轉換成比該圖片大的2的冪次方值。
ToSmaller : 轉換成比該圖片小的2的冪次方值。

3.Mipmap在UI貼圖上一定要取消勾選。它有點類似於LOD技術,但是不同的是,LOD針對的是模型資源,而Mipmap針對的是紋理貼圖,勾選Mipmap後,Unity3D會生成八個精度不同的貼圖,根據貼圖與攝像機距離選擇使用不同精度的貼圖,距離攝像機越遠,顯示的貼影象素越低,反之,畫素越高。所以勾選Mipmap必然佔記憶體,大概會將記憶體提升30%,因為大多數UI圖片都是渲染在螢幕的最上層,就沒必要勾選。對於具有較大縱深感的3D遊戲,3D場景模型和角色一般是建議勾選Mipmap,能有效有效降低渲染頻寬的壓力,提升遊戲的渲染效率。