天天看點

遊戲中的壓縮紋理格式

歸納總結遊戲中使用到的各種紋理壓縮格式,詳解各自的來源和原理。

圖檔格式,是圖檔檔案的存儲格式,用于圖檔檔案的存儲和傳輸,通常在磁盤檔案,記憶體以及網絡傳輸中使用。

紋理格式是顯示卡能夠直接進行采樣的紋理資料的格式,是向顯示卡中加載紋理時使用的資料格式。

圖檔格式和紋理格式的關系,就是沒有關系。如果圖檔要傳輸給顯示卡使用,則必須轉換成顯示卡能夠識别的紋理格式,這個在遊戲引擎中,會對應自動轉換,也可以通過相關的代碼設定顯式的轉換。

常見的圖檔格式,有 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