本人才疏學淺,只是近期略看了一下Texture的記憶體,如有不對的地方,還望大佬指正。
參考文章:
你所需要了解的幾種紋理壓縮格式原理
1.說一說圖片佔用的記憶體
關於圖片的記憶體,是怎麼算的呢,就是圖片的長乘以寬,乘以每個畫素點佔的byte大小。
MaxTextureSize,影響的就是基礎的長和寬。
圖片的壓縮格式,影響的就是每個畫素點佔的byte大小。
就舉一個最基礎的例子,1024X1024大小,格式是RGBA32的圖片。
那其記憶體就為1024x1024x32/8=4x(1024x1024)=4MB。
我們知道1024x1024就是1M(bit),除以8換算為M(Byte),乘以32則是RGBA32中的那個單個畫素佔的大小,就是32,合起來就是4MB的大小。
2.聊聊MaxTextureSize
而MaxTextureSize,影響的就是圖片解析度。也就是圖片在記憶體中的長寬。
不過也有個前提:當MaxTextureSize大於圖片的實際大小時,仍會使用原圖片的大小。
當然,也有個需要注意的地方:圖片的大小不能超過SystemInfo.maxTextureSize的大小。
3.說一下壓縮格式
關於壓縮格式。介紹起來就很多了,如果你開啟unity當中的圖片,然後開啟format可能就會驚恐的發現這個圖
哇,有這麼多格式,只看上一眼便要叫人生出敬畏之心。
莫慌,慢慢來。
這些格式,仔細看一眼,就可以發現,大概分為幾類:ASTC、ETC、DXT、PVRTC、以及不採用壓縮格式的RGBA。
關於這些格式的原理有興趣的可以看這個大佬寫的文章。連結:https://zhuanlan.zhihu.com/p/237940807
我這裡只做一個簡單粗暴的我自己使用的壓縮格式:
如果目標是電腦PC
效能最優的情況下,使用RGBA32
相容低效能的情況下,可以選擇ARGB16
如果你還想更極限一點,把圖片的寬高設定為4的倍數,然後使用DTX1(不支援Alpha)/DTX5
如果目標是安卓手機
ASTC使用: 4X4 5X5 6X6 8X8(ASTC任意圖片的寬高)
ETC2使用:Crunched 100/80(ETC2需要圖片的寬高為四的倍數)
都不支援的情況下使用ETC (ETC需要圖片的寬高為2的冪數,並且不支援alpha通道)
如果目標是iOS手機
ASTC使用: 4X4 5X5 6X6 8X8
不支援ASTC的情況下使用PVRTC(PVRTC需要圖片的寬高為2的冪數)
然後Override ETC2 fallback:高質量統一選擇32bit,低質量統一選擇16bit
Normal map型別的預設按照高質量來,如果你想極限的話,按照低質量也不是什麼問題
注:
Crunched的實際執行時記憶體佔用與普通的記憶體佔用一樣,只是更加節省儲存。
Crunched的圖片就是壓縮之後再次被crunched壓縮一下,所以Crunched之後的圖片,在使用時會再次解壓縮為相對應的圖。
ASTC 4X4 5X5 對應的是高質量的RGBA和RGB圖片
ASTC 6X6 8X8 對應的是低質量的RGBA和RGB圖片
如果圖片很糊也不影響並且記憶體急需的情況下,可以使用ASTC的10X10、12X12(圖片本身在遊戲中佔的畫素越小越好)
如果是3D使用的紋理有遠近變化的,建議統一開啟MipMap,雖然會增加大約1/3的記憶體,但是效果確實好。
順便舉一個1024X1024圖片的例子:
圖片格式 | 圖片大小 |
---|---|
RGBA32 | 4M |
RGBA16 | 2M |
ASTC4X4 | 1M |
ASTC5X5 | 0.6M |
ASTC6X6 | 456.9KB |
ETC2(8bit) | 1M |
ETC(4bit) | 0.5M |
PVRTC(4bit) | 0.5M |
至於怎麼算的:就是1024X1024=1Mb,然後除以8乘以每畫素佔用記憶體,就是當前圖片的大小。