W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
游戲運行時占用的內(nèi)存大小,是衡量游戲性能的一個非常重要的指標。游戲如果占用的內(nèi)存過大,會導(dǎo)致以下的問題:
而紋理占用的內(nèi)存占整個運行內(nèi)存的比重非常大,并且容易做優(yōu)化,所以紋理內(nèi)存占用的大小是需要重點關(guān)注的。
下面是一張圖片加載的整個流程。
可以看出讀取非壓縮紋理與壓縮紋理的主要區(qū)別是: 壓縮紋理不需要解碼 ,數(shù)據(jù)是可以直接被 gpu 讀??;png 等格式圖片,不能直接被 gpu 讀取,需要解碼成未壓縮的位數(shù)據(jù)。不過實際運行中, 并不是所有階段的數(shù)據(jù)都需要保存 。非壓縮紋理在 cpu 內(nèi)存里的編碼數(shù)據(jù)(藍色區(qū)域),在解碼后,是不需要再保存的。
下面列舉幾種小游戲開發(fā)可以使用的紋理管理方案:
那么這三種方式各有什么優(yōu)缺點呢?
第 1 種方式是運行性能最好的,因為所有的紋理數(shù)據(jù)都在 gpu 內(nèi)存,可以直接繪畫,無需從 cpu 內(nèi)存 copy 數(shù)據(jù),占用的內(nèi)存比較大。但是要求你對 webgl 和所使用的引擎,有一定的了解,保證 gpu 內(nèi)的紋理數(shù)據(jù),沒有被引擎或者自己釋放。游戲引擎在繪制紋理的時候,如果發(fā)現(xiàn) gpu 內(nèi)存中沒有紋理數(shù)據(jù),就會從 cpu 內(nèi)存中尋找數(shù)據(jù)并拷貝。但是由于這種方式,我們沒有在 cpu 內(nèi)存中放置紋理數(shù)據(jù),如果 gpu 中的某些紋理數(shù)據(jù)被釋放了,后面就無法繪制了。如果使用 three.js 這種不自動回收 gpu 資源的引擎,并且整個游戲紋理內(nèi)存占用不大的情況下,可以用這種方法。
第 2 種方式占用的內(nèi)存要比第 1 種方式大,并且性能不如第 1 種方式(如果你提前將需要的紋理加載進 gpu 內(nèi)存,那性能就和 1 一樣了)。大部分引擎會在繪制紋理時,負責(zé)將紋理數(shù)據(jù)從 cpu 內(nèi)存 copy 進 gpu 內(nèi)存,并且管理釋放。如果引擎不釋放資源的話,就需要自己去做。
第 3 種方式的優(yōu)點是,占用的內(nèi)存小,特別適合做多關(guān)卡、多場景游戲。缺點是,需要管理好資源的加載與釋放問題。一般在加載關(guān)卡進度的時候,完成資源的加載。
要想優(yōu)化紋理占用的內(nèi)存,就要知道如何計算每張紋理的大小。下面用一個例子進行說明。
上面是臉萌的主場景圖片,jpg 格式,尺寸為 512*512,顏色空間為 RGB888,大小 100kb。解碼后占用的內(nèi)存大小計算公式為:長 * 寬 * 通道個數(shù) * 通道位數(shù),如果解碼成 RGB888 格式,那么占用的內(nèi)存大小為 512*512*3*8bit = 0.75M。而對應(yīng)的 etc2 RGB888 格式的壓縮紋理占用的內(nèi)存大小為 512*512*0.5byte = 0.125M(實際大小為 135kb,因為還包含紋理描述信息)。下面的表格列舉出幾種常用的壓縮紋理格式每像素占用的字節(jié)數(shù)。
那么減少單張圖片占用的內(nèi)存,有以下幾個方案:
像 pngquant、tinypng 等采用 color reduction 方法壓縮圖片的工具,能夠減小文件大小,加快加載速度,編碼數(shù)據(jù)占用的內(nèi)存也更小。但是在解碼方式不變的情況下,并不能減小解碼后的圖片內(nèi)存占用大小。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: