[Unity優化]圖片壓縮格式


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,然后與壓縮的紋理一起存儲在內存中,會增加紋理加載時間和增加額外內存



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM