【Unity】記憶體最佳化之— —Texture的MaxTextureSize以及Format壓縮格式

皮卡味月亮發表於2024-03-11

本人才疏學淺,只是近期略看了一下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乘以每畫素佔用記憶體,就是當前圖片的大小。

相關文章