android平台
不帶透明通道優先使用etc1,而帶透明通道的優先使用etc2.
如果顯示質量無法達到要求還可以使用rgba16,最後才使用rgba32.
總體來說正確使用優先順序是etc1>etc2->rgba16->rgba32.
另外針對android平台unity還實現了一套crunched壓縮方式,比如rgba crunched etc2壓縮格式,會先用etc2進行壓縮,然後再用crunched壓縮一遍。雖然執行時邏輯上需要再額外解壓縮一遍,但是由於crunched壓縮會讓貼圖大小更小,載入的時間會比單純載入etc2快很多。總體來說rgba crunched etc2會比etc2載入更快,而且包體會更小.
紋理優化:通道分離
針對android平台unity還提供了一種通道分離的方式: 將壓縮成etc1,提取alpha生成一張通道圖. 為了讓混合起來的alpha效果更好,unity將通道圖儲存的格式設定為a8格式。 比如一張1024x1024的貼圖,etc1壓縮結果為0.5m,通道圖提取後a8格式壓縮結果為1m,加起來就是1.5m。對比直接使用etc2壓縮1024貼圖為2m,前者節省了0.5m記憶體。注意 雖然使用通道圖記憶體上可以減少一些,但是在shader中需要進行2次取樣,綜合看在某些機器上未必效能會得到提公升。
ios平台
如果沒有透明通道那麼使用pvrtc來壓縮必然是首選 優先使用pvrtc,其次使用astc. 不帶透明通道可以使用astc 5x5(表示每個壓縮塊的大小是5 x 5=25),帶透明通道可以使用astc 4x4(表示每個壓縮塊的大小是4 x 4=16).
如果顯示質量無法達到要求還可以使用rgba16,最後才使用rgba32,總體來說正確的使用優先順序順序是pvrtc>astc->rgba16->rgba32。
總結
以一張1024x1024的貼圖為例:
rgba32 bit:表示每個畫素占用32位4位元組,記憶體大小 1024 x 1024 x 4 = 4m
rgba16 bit:表示每個畫素占用16位2位元組,記憶體大小 1024 x 1024 x 2= 2m
rgb etc1 4bit: 表示每個畫素占用4位0.5位元組,記憶體大小 1024 x 1024 x 0.5= 0.5m
rgba etc2 8bit: 表示每個畫素占用8位1位元組,記憶體大小 1024 x 1024 x 1= 1m
rgba pvrtc 4bit: 表示每個畫素占用4位0.5位元組,記憶體大小 1024 x 1024 x 0.5= 0.5m
rgba astc 4x4 : 表示每個畫素占用8位1位元組,記憶體大小 1024 x 1024 x 1= 1m
很顯然占用記憶體越小的貼圖,載入速度肯定就越快,那麼開啟這樣的介面無疑也就越快了。
紋理尺寸注意事項
並不是所有都需要打圖集的,因為一旦打進圖集,哪怕僅僅只需要顯示這個圖集上的一小部分,也會把整個圖集拉進記憶體中。所以我們會將寬高超過128或者256的圖從圖集中拿出來,比如遊戲中的一些玩家頭像,背景圖等等。
ios上如果沒有透明通道那麼使用pvrtc來壓縮必然是首選. 如果一些玩家的頭像設計上就不是正方形,如果恰巧頭像沒有半透,那麼使用astc豈不是浪費了。
由於圖集肯定滿足2的冪次方,所以我們將這張圖變成乙個單獨的圖集就可以進行正確的壓縮了 而且不會模糊,如果使用non power of 2拉伸就會模糊。
注意etc1、etc2以及astc 4x4 要求寬和高可以不相等但是必須被4整除,例如512x1024 4x16
ios的pvrtc壓縮格式要求的寬高必須相等並且是2的整數次冪,例如512x512,如果是512x1024那麼就無法壓縮了。
另外etc2和astc 對硬體也有一些限制,etc2只支援opengl es 3.0以上的android手機(大概2023年以後的手機都支援)astc只支援蘋果a8以後的裝置,iphone 6 及以上的手機(大概2023年以後的手機都支援)。
原內容來自於 雨松momo的uwa課堂
Unity紋理格式之Crunched及記憶體
根據unityblog的介紹,crunch壓縮能實現更高的壓縮率和更少的壓縮時間。測試如下 原圖 astc 12x12 etc2 crunched etc2 由此可見,crunch壓縮率確實非常高啊。限制 crunched etc要求紋理必須是2的冪次方。crunched etc2要求紋理必須是4的...
Unity 紋理壓縮
紋理顯示到螢幕上,需要cpu和gpu協作完成。cpu對資源進行計算解碼,然後將紋理資料傳輸給gpu。gpu通過cpu的資料,將資料渲染到緩衝區。紋理壓縮減少了資源在cpu中進行解壓縮的過程。紋理壓縮減小了包體大小,減少了資料量級,減輕了頻寬計算的壓力。紋理壓縮時記憶體的使用效率更高。dxt格式是nv...
Unity建立紋理及紋理濾波
unity3d中建立紋理使用的是unity中的texture2d的建構函式。texture2d int width,int height texture2d int width,int height,textureformat format,bool mipmap texture2d int wid...