cocosCreator版本:2.4.4
平臺:android
測試工具:adb ,perfdog: https://perfdog.qq.com/
紋理壓縮工具:cocoscreator 提供的etc1A slow模式
測試參數(shù):一張 1280 * 720 的png格式的背景圖片
這篇文章主要圍繞「cocoscreator提供的紋理壓縮功能」及 「紋理壓縮相關(guān)的知識點」來進行的,通過閱讀本篇文章天梧,你可以 更清晰的認(rèn)識在你的項目中 如何權(quán)衡 是否用紋理壓縮 來達到你想要的 優(yōu)化效果霉旗。
紋理壓縮相關(guān)知識點
1,計算機中計量存儲容量計量單位:
「位(bit」 數(shù)據(jù)存儲的最小單位冰蘑。在計算機中的二進制數(shù)系統(tǒng)中,位村缸,簡記為b,也稱為比特祠肥,每個0或1就是一個位(bit)。計算機中的CPU位數(shù)指的是CPU一次能處理的最大位數(shù)梯皿。
「字節(jié)(byte」字節(jié)(Byte)是計算機信息技術(shù)用于計量存儲容量的一種計量單位仇箱,也表示一些計算機編程語言中的數(shù)據(jù)類型和語言字符。Byte是從0-255的無符號類型东羹,所以不能表示負(fù)數(shù) 剂桥。
KB: 千字節(jié) 是計算機信息技術(shù)用于計量存儲容量的一種計量單位
MB:兆字節(jié) 是計算機信息技術(shù)用于計量存儲容量的一種計量單位
GB:是計算機信息技術(shù)用于計量存儲容量的一種計量單位
關(guān)系:
1GB = 1024MB
1MB = 1024KB
1KB = 1024Byte
1Byte = 8bit
1bit(位) 是數(shù)據(jù)存儲最小單位
2,像素格式。
像素格式描述了像素數(shù)據(jù)存儲所用的格式属提。定義了像素在內(nèi)存中的編碼方式权逗。
「像素深度」:像素深度是指存儲每個像素所用的位數(shù)美尸,也用它來度量圖像的分辨率。像素深度決定彩色圖像的每個像素可能有的顏色數(shù)斟薇,或者確定灰度圖像的每個像素可能有的灰度級數(shù)师坎。例如,一幅彩色圖像的每個像素用R堪滨,G胯陋,B三個分量表示,若每個分量用8位椿猎,那么一個像素共用24位表示惶岭,就說像素的深度為24。一個像素的位數(shù)越多犯眠,它能表達的顏色數(shù)目就越多,而它的深度就越深症革。
「顏色通道」:一般用RGBA來表示 顏色通道中R,G,B,A的意義是:R 紅色成分筐咧,通常范圍從0.0(沒有紅色)到1.0(全部的紅色)。G 綠色成分噪矛,通常范圍從0.0(沒有綠色)到1.0(全部的綠色)量蕊。B 藍色成分,通常范圍從0.0(沒有藍色)到1.0(全部的藍色)艇挨。A alpha(不透明度)成分残炮,通常范圍從0.0(完全透明)到1.0(不透明)。
「像素格式」:每個像素所使用的顏色通道的組合模式
常見的像素格式有:
「RGBA4444」 :每個通道占4位(bit) 及用此種格式表示一個像素 占用的存儲大小是 4*4 = 16 位 = 2Byte缩滨。
「RGBA8888」 :每個通道占8位(bit) 及用此種格式表示一個像素 占用的存儲大小是 4*8 = 32 位 = 4Byte势就。
「RGB565」 :占用的存儲大小 5+6+5 = 16 位 = 2Byte
「RGB888」 :每個通道占8位(bit) 及用此種格式表示一個像素 占用的存儲大小是 3*8 = 24 位 = 3BYte。
等等其他格式脉漏。
每個像素的大小 取決于 像素深度 及每個顏色通道所占的位數(shù) 所有通道位數(shù)的累加苞冯。
2,一張圖片在磁盤中的大小,一張圖片加載到內(nèi)存中的大小
「我們在 磁盤中看到的一張圖片的大小 與 加載到內(nèi)存中該圖片所占用的大小 是不一樣的 侧巨,png格式是一種復(fù)雜的編碼壓縮格式舅锄,可以把圖像信息 高比例壓縮,便于傳輸司忱,而加載到內(nèi)存中 需要解壓解碼還原原始信息皇忿。所以 在內(nèi)存中占用的大小要遠遠大于我們在磁盤中看到的大小」后面會詳細(xì)解釋,這里先了解一下坦仍。
通常情況下 計算一張png圖片加載到內(nèi)存的占用大小公式是: 「圖片分辨率4 = 占用內(nèi)存」* 單位是字節(jié)
比如一張1280 * 720 的背景圖 所占的內(nèi)存(顯存)是
1280 * 720 * 4 = 3686400 byte = 3686400 / 1024 = 3600 kb = 3600 / 1024 = 3.515 MB
因為一張圖片加載到內(nèi)存中的大小 是由他的像素格式?jīng)Q定的鳍烁,也是就是 每個像素所用的 像素格式 一般情況下 是默認(rèn)「rgba8888」格式也就是 一個像素32位 及4個字節(jié)。 如果 格式用「rgba4444」 那就是 16位 及2個字節(jié) 那計算出來的 內(nèi)存占用是:
「圖片分辨率2 = 占用內(nèi)存」* 單位是字節(jié)
細(xì)化后的 計算公式是「分辨率寬分辨率高 * 像素格式通道所占用的位數(shù) / 8 = 內(nèi)存占用」*
如果是安卓手機 圖片在不同目錄下 系統(tǒng)會根據(jù) 所在目錄的dpi(圖像每英寸長度內(nèi)的像素點數(shù)) 進行 計算桨踪。
另外 如果用壓縮紋理格式的話 老翘, 壓縮后的紋理大小 跟紋理加載到gpu的大小 是一樣的。比如 一張1280 * 720 的png圖片 壓縮紋理后大小 1441kb 傳遞給 gpu 使用時的大小就是 1441kb。
1铺峭,圖片文件格式與紋理格式的區(qū)別
「圖片文件格式是」:將「位圖信息(圖像的表述方式墓怀,二維數(shù)組)」 通過 特殊的編碼 生成的存儲格式,用于圖像信息的存儲和傳輸卫键,一般在磁盤傀履,內(nèi)存及網(wǎng)絡(luò)中存儲與傳輸。我們經(jīng)忱蚵看到的圖片文件格式 有 png钓账,jpg等格式,「png(無損壓縮)」, 「jpg(有損壓縮」也會把這些圖片稱為紋理絮宁,但他們并不是紋理格式梆暮,不能被GPU直接讀取并顯示。這些文件格式當(dāng)被游戲讀入后绍昂,需要經(jīng)過CPU解碼成 「原始位圖(位圖的每個像素可以用RGB格式(像素/紋理格式)表述如:RGB565啦粹,RGBA4444,RGBA5555窘游,RGB888, RGBA8888)」 唠椭,再傳送到GPU端進行使用。
「紋理格式」:是能被GPU所識別的像素/紋理格式(「RGB565忍饰,RGBA4444贪嫂,RGBA5555,RGB888, RGBA8888等」)艾蓝,能被快速尋址并采樣力崇。是GPU能直接使用的數(shù)據(jù)格式。
2饶深,什么是紋理壓縮餐曹,常見的壓縮紋理格式
「紋理壓縮格式」 :
紋理壓縮原理參考地址:https://www.khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt
參考博客:https://www.cnblogs.com/fuckgiser/p/5497013.html
壓縮紋理,是一種GPU能直接讀取并顯示的格式敌厘,使得圖像無需解壓即可進行渲染台猴,可節(jié)約大量的內(nèi)存。常見的紋理壓縮格式ETC,PVRTC.
「ETC:」是一種為感知質(zhì)量設(shè)計的有損算法俱两,其依據(jù)是人眼對亮度改變的反應(yīng)要高于色度改變饱狂。是把4x4的像素塊壓縮成一個64或128位的數(shù)據(jù)塊,,是有損壓縮宪彩。壓縮率6:1休讳,ETC 分為兩種,「ETC1」和「ETC2」 ETC1適用于Opengl ES 2.0 支持幾乎所有市面上的Android機尿孔,所有iPhone ETC2 適用于 Opengl ES 3.0 支持大部分高端Android機俊柔,iPhone 5S及以上機型筹麸。
「PVRTC:」PVRTC格式與基于塊的壓縮格式皂甘,與ETC的不同之處是忙干,它使用2張雙線性放大的低分辨率圖,根據(jù)精度和每個像素的權(quán)重较坛,融合到一起來呈現(xiàn)紋理留晚,并且2-bpp和4-bpp都支持ARGB數(shù)據(jù)酵紫。PVRTC格式壓縮比較高,也是有損壓縮错维。壓縮比 2-bpp 16:1 4-bpp 8:1. 只支持長寬相等且為2的冪次方的紋理,支持部分Android機(GPU:PowerVR系列)奖地,iPhone全系列機型
「opengl與webgl版本對應(yīng)關(guān)系」
OpenGL 2.0 ——> OpenGL ES 2.0 ——> WebGL 1.0
OpenGL 3.3 ——> OpenGL ES 3.0 ——> WebGL 2.0
紋理壓縮對游戲項目的影響
1,包體
1)紋理壓縮后的文件要比 png文件大很多(etc紋理壓縮的文件名后綴是.pkm) 一張35kb左右的 1280 * 720 的png格式 的圖片 紋理壓縮后的 pkm文件是 1.4MB左右赋焕。
2)打成蘋果包和安卓包 后 大小 壓縮紋理的 包要比 png的包小 一些 項目中只有一張自己添加的1280 * 720的背景圖
沒有壓縮紋理的包體是 9254kb
壓縮紋理的包體是 9227kb
3)如果需要動態(tài)加載又想節(jié)省下載時間成本 可以考慮 紋理壓縮后進行zip壓縮 下載到本地后進行解壓縮 這種方案参歹。權(quán)衡利弊。
zip壓縮后的大泻暧省:測試用的工具是 7-zip 僅用于測試泽示。項目中可以考慮用gzip 命令gzip地址 http://gnuwin32.sourceforge.net/packages/gzip.htm
壓縮前1441kb 壓縮后9kb2,內(nèi)存
1)通過翻閱大量資料和實際測試 png格式的圖片 加載到內(nèi)存 到提供給gpu渲染蜜氨。會保存兩份 cpu解碼后的位圖數(shù)據(jù) ,一份放在cpu 一份放在gpu. 壓縮紋理的數(shù)據(jù) 則只在gpu保留一份捎泻。
2)測試數(shù)據(jù) 兩種方式:一種將1280 * 720的圖片直接拖到編輯器 第二種是 用cc.resources.load動態(tài)加載
「a」:直接拖到編輯器 貼圖大小 1280*720 加載之前 內(nèi)存占用 約 121MB 加載紋理壓縮后的 圖片 內(nèi)存占用122-123MB 未壓縮紋理的加載占用內(nèi)存是 125-126左右
「b」:用cc.resources.load動態(tài)加載
未進行紋理壓縮的圖片:
未加載---加載后----加載瞬間內(nèi)存占用
118MB 128MB 130MB
117MB 128MB 130MB
118MB 127MB 130MB
114MB 124MB 125MB
104MB 116MB 116MB
進行紋理壓縮后的內(nèi)存占用:
124MB 129MB 129MB
118MB 123MB 123MB
117MB 122MB 122MB
117MB 122MB 122MB
117MB 122MB 122MB
通過測試數(shù)據(jù)可以看出
1)計算 一張圖片 加載到內(nèi)存的 大小公式:分辨率 * 通道數(shù) *單個通道占用內(nèi)存的大徐住(bit) 與 實際測試的 數(shù)據(jù) 有些偏差。
2)通過直接將圖片拖到編輯器上 與 動態(tài)加載圖片 的內(nèi)存占用 數(shù)據(jù) 偏差很大 笆豁,前者占用較小 與 計算公式所得的結(jié)果 相近郎汪, 后者翻了2倍左右
3)壓縮紋理后占用內(nèi)存 大小 遠遠小于 未壓縮紋理占用內(nèi)存大小,約 2倍左右闯狱。
注意:webgl 只支持rgba8888格式
最后 會按照 32的倍數(shù) 占用內(nèi)存
3煞赢,加載時間
理論上 壓縮紋理的 加載時間 要遠遠小于 未壓縮紋理的時間 。因為 壓縮紋理 可以被gpu快速尋址采樣哄孤,不需要cpu的解碼 照筑,這個過程時間的消耗很大。而未壓縮紋理的 需要經(jīng)過特定的解碼規(guī)則 進行解碼瘦陈,還原 成原始位圖凝危,傳送給gpu 進行渲染。
4晨逝,cup負(fù)荷
因為未壓縮紋理的圖片 在加入到內(nèi)存后 需要cpu進行解碼 還原成位圖蛾默,而壓縮紋理格式不需要,所以 后者會減輕cpu的負(fù)荷捉貌。
總結(jié)一下壓縮紋理的 優(yōu)缺點:
「優(yōu)點」:包體較小支鸡,減小首包下載時間和流量冬念。內(nèi)存占用小,對cpu的壓力小 牧挣,減少手機耗電量急前,減少游戲由于占用內(nèi)存過大導(dǎo)致的崩潰概率。
「缺點」:不同的壓縮紋理格式對手機設(shè)備的支持 不盡相同浸踩,所以 需要根據(jù)市場情況選擇不同的壓縮格式叔汁。紋理壓縮后的文件 遠遠大于png等壓縮格式的大小,對于熱更新检碗,動態(tài)遠程加載資源 來說 是很大的考驗据块,時間久資源包體大≌厶辏可以進行zip壓縮解壓縮另假,處理這種問題。
在cocosCreator中配置及使用紋理壓縮功能
官方文檔參考