1.參考資料
游戲中的壓縮紋理格式:https://www.cnblogs.com/zblade/p/10308038.html
[Unity優化] unity圖片壓縮格式和內存計算:https://www.jianshu.com/p/92fc1442a63e
學習筆記——Unity3D內存優化(貼圖優化):https://blog.csdn.net/qq_39824797/article/details/84339886
Unity優化之貼圖:https://www.cnblogs.com/ssw-men/p/10472007.html
Uinty3D性能優化之貼圖科普篇:https://blog.csdn.net/acuriousguy/article/details/109492105
2.總結
(1)圖片格式描述
圖片文件的存儲格式:用於圖片文件的存儲和傳輸,通常在磁盤文件,內存以及網絡傳輸中使用。
常用的圖像文件格式有BMP,TGA,GIF,JPG(有損不透明),PNG(無損透明)等;
(2)紋理格式描述
顯卡能夠直接進行采樣的紋理數據的格式:是向顯卡中加載紋理時使用的數據格式。
常用的紋理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。
占用空間:R5G6B5,A4R4G4B4,A1R5G5B5每個像素占用2個字節(BYTE),R8G8B8每個像素占用3個字節,A8R8G8B8每個像素占用4個字節。
例如:對於一個512 * 512大小的紋理,如果使用R5G6B5的紋理格式,其大小為512 * 512 * 2 = 512KB, 用A8R8G8B8, 就是1M,可以預見,游戲中占用容量最大將是各種紋理,很容易導致游戲安裝包突破上G,為了縮小紋理格式的數據占用的內存大小,對應的壓縮紋理格式產生了。注意,這不是在移動游戲出現后才產生的,早在PC端游戲時代就有壓縮紋理格式。
(3)壓縮紋理格式
<0>移動GPU的四大廠商
<1>基於OpenGL ES的壓縮紋理格式
ETC1(Ericsson texture compression)
不支持透明通道,所以僅能用於不透明紋理,OpenGL2.0支持
這種壓縮紋理格式是OpenGL ES的圖形標准,被所有的android設備支持,不支持透明通道,每個像素0.5個字節
ETC2
針對ETC1不支持透明通道的改進,用ETC2可以支持透明通道,不過要求OpenGL ES3.0及以上(Android4.3+),目前基本覆蓋率在9成以上
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個字節
ASTC
目前各大廠商主推的壓縮紋理格式,壓縮質量高,壓縮塊方案多,代價是壓縮時間長(需要不斷嘗試壓縮結果,算法決定)
DXTC(又名S3TC,S3 texture compression)
是一種有損紋理壓縮算法,可以說DXT是目前應用最廣泛的紋理壓縮格式,可以認為所有的PC端顯卡都支持DXT壓縮。在多數紋理壓縮選擇中都是最佳方案,幾乎可以認為是PC下的標准壓縮格式。
基本的壓縮參數有:
RGB_S3TC_DXT1, RGB, 每個像素0.5個字節
RGBA_S3TC_DXT1, RGBA, 每個像素0.5個字節
RGBA_S3TC_DXT3, RGBA, 每個像素1個字節
RGBA_S3TC_DXT5, RGBA,每個像素1個字節
<2>Unity紋理格式總結
每位的像素點(bpp)是單個像素所需的存儲量。該值越低,可以在GPU的緩存中存儲的像素越多,從而可以更快地進行紋理訪問。
可變比特率(VBR)表示每個像素的比特不是固定值,而是取決於實際內容。VBR僅適用於Crunch壓縮,並且僅適用於磁盤上的紋理大小。內存中的大小與使用基礎紋理格式時的大小相同(例如,對於RGB Crunched DXT1,使用RGB Compressed DXT1)。
Crunch compression是DXT或ETC Texture壓縮之上的一種有損壓縮格式(部分數據在壓縮過程中丟失)。紋理在CPU上被解壓縮為DXT或ETC,然后在運行時加載到GPU。
Crunch compression有助於Texture使用盡可能少的磁盤空間,但對運行時內存使用沒有影響。
Crunch compression可能需要很長時間才能壓縮,但是在運行時進行解壓縮非常快。
質量和壓縮時間之間的平衡:質量越高,文件大小越大。為了獲得最佳性能,尤其是在移動設備上,請使用應用程序所針對的硬件所支持的每像素位數最少的格式,只要該格式能夠提供足夠的視覺質量即可。
<3>推薦使用的壓縮紋理格式
[1]描述
移動端:android使用ETC2, ios使用PVRTC或者ASTC
PC端:DXT
[2]具體
通常
清晰度
1.(高清晰無壓縮)采用RGBA32
2.(中清晰中壓縮)RGBA16+Dithering 要采用Floyd Steinberg抖動處理,不然漸變很明顯,拉伸就會差距
3.(低清晰高壓縮)ETC2 PVRTC
4.ASTC壓縮率和清晰度都會比較好,支持的GPU :
tvOS (all), iOS (A8以上,5S以下), Android (PowerVR 6XT, Mali T600 series, Adreno 400 series, Tegra K1)
2016年之后的安卓手機基本支持這種壓縮格式
iphone6以及之后的機型支持這種壓縮格式
例子:
(4)圖片格式和紋理格式關系
沒有關系。如果圖片要傳輸給顯卡使用,則必須轉換成顯卡能夠識別的紋理格式,這個在游戲引擎中,會對應自動轉換,也可以通過相關的代碼設置顯式的轉換。
這樣的過程,有一個問題,就是加壓縮,解碼,重新編碼壓縮的過程比較消耗CPU,如果在游戲總實時的執行這樣的一個過程,會出現明顯的卡頓掉幀。
一般在項目中,在資源導入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入游戲包或者Bundle中的是已經預先轉換好的紋理格式,這樣加載的時候優化了解碼和轉換的過程,能夠提高加載速度。這也是為什么不同平台的bundle不能跨平台使用的原因之一。
注:使用目標平台支持的紋理壓縮格式時,GPU可以直接使用它,沒有增加消耗;
如果目標平台不支持紋理壓縮格式時,默認會將紋理解壓成RGBA32或RGB32,然后與壓縮的紋理一起存儲在內存中,會增加紋理加載時間和增加額外內存。