轉載請標明出處:http://www.cnblogs.com/zblade/
一、概要
歸納總結游戲中使用到的各種紋理壓縮格式,詳解各自的來源和原理。
二、圖片格式和紋理格式
2.1 圖片格式和紋理格式
圖片格式,是圖片文件的存儲格式,用於圖片文件的存儲和傳輸,通常在磁盤文件,內存以及網絡傳輸中使用。
紋理格式是顯卡能夠直接進行采樣的紋理數據的格式,是向顯卡中加載紋理時使用的數據格式。
圖片格式和紋理格式的關系,就是沒有關系。如果圖片要傳輸給顯卡使用,則必須轉換成顯卡能夠識別的紋理格式,這個在游戲引擎中,會對應自動轉換,也可以通過相關的代碼設置顯式的轉換。
常見的圖片格式,有 jpg, png, bmp, tga, psd, dds, Gif, 游戲中一般用png, tga兩種格式,jpg由於不帶透明通道,所以不常被游戲采用。 psd容易做成較大的圖,所以也被摒棄。
紋理格式,其實就是針對顯卡而設置的一些圖片的數據格式。將圖片加載為紋理的時候,需要將圖片格式按照對應的規范解碼,一般先解碼為原始位圖,然后重新編碼為需要的紋理格式,當然這個過程引擎已經做好,不需要我們過多關注。
這樣的過程,有一個問題,就是加壓縮,解碼,重新編碼壓縮的過程比較消耗CPU,如果在游戲總實時的執行這樣的一個過程,會出現明顯的卡頓掉幀。為了解決這個過程,一般在項目中,在資源導入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入游戲包或者Bundle中的是已經預先轉換好的紋理格式,這樣加載的時候優化了解碼和轉換的過程,能夠提高加載速度。這也是為什么不同平台的bundle不能跨平台使用的原因之一。
2.2 移動GPU的四大廠商
目前市面上的GPU的四大廠商有:
- Imagination Technologies的PowerVR SGX系列,代表是 Apple/iPad系列,三星部分系列
- Qualcomm的Adreno系列, 代表作是 HTC,小米部分系列
- ARM的Mali系列,代表作是三消的Galaxy系列
- nVIDIA的Tegra系列,代表作是Google Nexus等
2.3 常見的紋理格式
常見的紋理格式有以下幾種: 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端游戲時代就有壓縮紋理格式。
三、壓縮紋理格式
3.1 基於OpenGL ES的壓縮紋理格式
代表性的壓縮紋理格式有
-
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個字節
3.2 后起的壓縮紋理格式
- ETC2
針對ETC1不支持透明通道的改進,用ETC2可以支持透明通道,不過要求OpenGL ES3.0及以上(Android4.3+),目前基本覆蓋率在9成以上 - ASTC
目前各大廠商主推的壓縮紋理格式,壓縮質量高,壓縮塊方案多,代價是壓縮時間長(需要不斷嘗試壓縮結果,算法決定)
3.3 各種壓縮紋理格式對紋理格式圖片的壓縮比例
摘自網上的數據,沒有具體的實測,以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
3.4 推薦使用的壓縮紋理格式
目前(日本)市面上ES3.0的占比超過9成,Apple A8占比超過9成,推薦android使用ETC2, ios使用ASTC,或者PVRTC