概括總結遊戲中使用到的各類紋理壓縮格式,詳解各自的來源和原理。css
圖片格式,是圖片文件的存儲格式,用於圖片文件的存儲和傳輸,一般在磁盤文件,內存以及網絡傳輸中使用。android
紋理格式是顯卡可以直接進行採樣的紋理數據的格式,是向顯卡中加載紋理時使用的數據格式。ios
圖片格式和紋理格式的關係,就是沒有關係。若是圖片要傳輸給顯卡使用,則必須轉換成顯卡可以識別的紋理格式,這個在遊戲引擎中,會對應自動轉換,也能夠經過相關的代碼設置顯式的轉換。算法
常見的圖片格式,有 jpg, png, bmp, tga, psd, dds, Gif, 遊戲中通常用png, tga兩種格式,jpg因爲不帶透明通道,因此不常被遊戲採用。 psd容易作成較大的圖,因此也被摒棄。網絡
紋理格式,其實就是針對顯卡而設置的一些圖片的數據格式。將圖片加載爲紋理的時候,須要將圖片格式按照對應的規範解碼,通常先解碼爲原始位圖,而後從新編碼爲須要的紋理格式,固然這個過程引擎已經作好,不須要咱們過多關注。優化
這樣的過程,有一個問題,就是加壓縮,解碼,從新編碼壓縮的過程比較消耗CPU,若是在遊戲總實時的執行這樣的一個過程,會出現明顯的卡頓掉幀。爲了解決這個過程,通常在項目中,在資源導入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入遊戲包或者Bundle中的是已經預先轉換好的紋理格式,這樣加載的時候優化了解碼和轉換的過程,可以提升加載速度。這也是爲何不一樣平臺的bundle不能跨平臺使用的緣由之一。編碼
目前市面上的GPU的四大廠商有:blog
常見的紋理格式有如下幾種: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8, 總共四種基本紋理格式,遊戲
對於一個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個字節
摘自網上的數據,沒有具體的實測,以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
RGBA ETC2 8Bits: 0.25
RGB+ 1-bit ALPHA ETC2 8Bits: 0.125
目前(日本)市面上ES3.0的佔比超過9成,Apple A8佔比超過9成,推薦android使用ETC2, ios使用ASTC,或者PVRTC