歸納總結遊戲中使用到的各種紋理壓縮格式,詳解各自的來源和原理。
圖檔格式,是圖檔檔案的存儲格式,用于圖檔檔案的存儲和傳輸,通常在磁盤檔案,記憶體以及網絡傳輸中使用。
紋理格式是顯示卡能夠直接進行采樣的紋理資料的格式,是向顯示卡中加載紋理時使用的資料格式。
圖檔格式和紋理格式的關系,就是沒有關系。如果圖檔要傳輸給顯示卡使用,則必須轉換成顯示卡能夠識别的紋理格式,這個在遊戲引擎中,會對應自動轉換,也可以通過相關的代碼設定顯式的轉換。
常見的圖檔格式,有 jpg, png, bmp, tga, psd, dds, Gif, 遊戲中一般用png, tga兩種格式,jpg由于不帶透明通道,是以不常被遊戲采用。 psd容易做成較大的圖,是以也被摒棄。
紋理格式,其實就是針對顯示卡而設定的一些圖檔的資料格式。将圖檔加載為紋理的時候,需要将圖檔格式按照對應的規範解碼,一般先解碼為原始位圖,然後重新編碼為需要的紋理格式,當然這個過程引擎已經做好,不需要我們過多關注。
這樣的過程,有一個問題,就是加壓縮,解碼,重新編碼壓縮的過程比較消耗CPU,如果在遊戲總實時的執行這樣的一個過程,會出現明顯的卡頓掉幀。為了解決這個過程,一般在項目中,在資源導入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入遊戲包或者Bundle中的是已經預先轉換好的紋理格式,這樣加載的時候優化了解碼和轉換的過程,能夠提高加載速度。這也是為什麼不同平台的bundle不能跨平台使用的原因之一。
目前市面上的GPU的四大廠商有:
Imagination Technologies的PowerVR SGX系列,代表是 Apple/iPad系列,三星部分系列
Qualcomm的Adreno系列, 代表作是 HTC,小米部分系列
ARM的Mali系列,代表作是三消的Galaxy系列
nVIDIA的Tegra系列,代表作是Google Nexus等
常見的紋理格式有以下幾種: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8, 總共四種基本紋理格式,
R5G6B5 每個像素占用2個位元組(BYTE)
A4R4G4B4 每個像素占用2個位元組
A1R5G5B5 每個像素占用2個位元組
R8G8B8 每個像素占用3個位元組
A8R8G8B8 每個像素占用4個位元組
對于一個512 * 512大小的紋理,如果使用R5G6B5的紋理格式,其大小為512 * 512 * 2 = 512KB, 用A8R8G8B8, 就是1M,可以預見,遊戲中占用容量最大将是各種紋理,很容易導緻遊戲安裝包突破上G,為了縮小紋理格式的資料占用的記憶體大小,對應的壓縮紋理格式産生了。注意,這不是在移動遊戲出現後才産生的,早在PC端遊戲時代就有壓縮紋理格式。
代表性的壓縮紋理格式有
ETC1(Ericsson texture compression)這種壓縮紋理格式是OpenGL ES的圖形标準,被所有的android裝置支援,不支援透明通道,每個像素0.5個位元組
PVRTC(PowerVR texture compression)
支援GPU為PowerVR SGX系列,基本的壓縮參數有:
RGB_PVRTC_4Bit, RGB, 每個像素0.5個位元組
RGB_PVRTC_2Bit, RGB, 每個像素0.25個位元組
RGBA_PVRTC_4Bit, RGBA, 每個像素0.5個位元組
RGBA_PVRTC_2Bit, RGBA, 每個像素0.25個位元組
ATITC(ATI texture compression) 支援GPU為Qualcomm的Adreno系列, 基本的壓縮參數有:
ATC_RGB_AMD, RGB, 每個像素0.5位元組
ATC_RGBA_EXPLICIT_ALPHA_AMD, RGBA, 每個像素1個位元組
ATC_RGBA_INTERPOLATED_ALPHA_AMD, RGBA, 每個像素1個位元組
DXTC(又名S3TC,S3 texture compression) PC上廣泛使用,基本的壓縮參數有:
RGB_S3TC_DXT1, RGB, 每個像素0.5個位元組
RGBA_S3TC_DXT1, RGBA, 每個像素0.5個位元組
RGBA_S3TC_DXT3, RGBA, 每個像素1個位元組
RGBA_S3TC_DXT5, RGBA,每個像素1個位元組
ETC2
針對ETC1不支援透明通道的改進,用ETC2可以支援透明通道,不過要求OpenGL ES3.0及以上(Android4.3+),目前基本覆寫率在9成以上
ASTC
目前各大廠商主推的壓縮紋理格式,壓縮品質高,壓縮塊方案多,代價是壓縮時間長(需要不斷嘗試壓縮結果,算法決定)
摘自網上的資料,沒有具體的實測,以RGBA32的大小為1,那麼各種壓縮格式在存儲上的大小為(不含ASTC):
RGB PVRTC 4Bits: 0.25
RGB PVRTC 2Bits: 0.13
ARGB PVRTC 4Bits: 0.25
ARGB PVRTC 2Bits: 0.13
RGBA ETC2 4Bits: 0.25
RGBA ETC2 8Bits: 0.25
RGB + 1-bit ALPHA ETC2 8Bits: 0.2
DXT1: 0.3
DXT5: 0.6
ARGB 16Bits: 0.33
ARGB 32Bits: 1
RGB 16Bits: 0.5
RGB 24Bits: 0.85
在記憶體中的對比,以RGBA32為1,其餘壓縮紋理格式的記憶體占用(不含ASTC):
ARGB 32 Bits: 1
ARGB 16 Bits: 0.5
RGB 24 Bits: 0.8
RGB 16 Bits: 0.5
DXT1: 0.125
DXT5:0.25
RGB PVRTC 4Bits: 0.125
RGB PVRTC 2Bits: 0.0625
ARGB PVRTC 4Bits: 0.125
ARGB PVRTC 2Bits: 0.0625
RGBA ETC2 4Bits: 0.125
RGB+ 1-bit ALPHA ETC2 8Bits: 0.125
目前(日本)市面上ES3.0的占比超過9成,Apple A8占比超過9成,推薦android使用ETC2, ios使用ASTC,或者PVRTC