cocos2d-x 優化(紋理渲染優化、資源快取、記憶體優化)

Norton-Linux核心研究發表於2020-04-07

概述

包括以下5種優化:引擎底層優化、紋理優化、渲染優化、資源快取、記憶體優化

引擎優化

2.0版本比1.0版本在演算法上有所優化,效率更高。2.0版本使用OpenGl ES 2.0圖形庫,1.0版本使用OpenGL ES 1.0。

紋理優化

紋理是最消耗記憶體的,而且會降低渲染速率。


二的冪次方

OpenGL在申請記憶體存放紋理時,是按2的冪次方申請的,即對應480*320的圖片,它申請的是512*512空間。可見,會有相當多的記憶體被浪費。所以,我們設計的圖片,最好是2的冪次方,不然OpenGL最終還是申請2的冪次方記憶體空間。

由於不是所有圖片都剛好能設計成2的冪次方,因此通過“拼圖”方法解決。這就是為啥要使用TexturePacker的原因。如圖:


色深優化

圖片所佔記憶體的大小用這條公式計算:高度畫素*寬度畫素*色深。如色深RGBA8888,是32個bit,每8bit是一個位元組,因此一個畫素點佔4位元組,就是一個整形字元大小。例子。一個480*320的圖片大小,佔記憶體480*320*4位元組。

通常,如果對圖片的色彩要求不是很高的話。ARGB8888(佔4位元組)可以改為,ARGB1555(2位元組)(透明通道A佔1位一般是用做圖片混合運算)或者ARGB4444(如果不是做混合運算,用4位比較合適)。或者,如果不需要使用圖片透明,就不需要A通道,直接使用RGB888(3位元組)改為RGB565(2位元組)。這樣,圖片的最終記憶體大小就會佔用更少的空間。

紋理壓縮格式

IOS系統使用PowerVR顯示晶片,可以直接硬解碼PVR格式,該格式可以直接被IOS讀取。不過該方式不適合Android等平臺。

PVR格式實際上就是把ARGB8888轉成ARGB1555色深進行儲存的。

骨骼動畫

cocos2d-x 2.0.3開始支援骨骼動畫,cocos2dBuilder2.1版本也可以進行動畫編輯。在處理動畫時,對記憶體優化也是很好的方案。

紋理尺寸限制

不同裝置支援的紋理尺寸不一樣,iphone4支援最大的是4096*4096,iphone4s是4096*2048。有的android裝置,僅僅限制在1024*1024。拼圖的時候要避免把圖片拼的太大。為了提高遊戲的相容性,圖片的尺寸最好都設定在1024*1024範圍內(主流裝置都支援)。

渲染優化

批次處理

使用CCSpriteBatchNode,準備好Sprite的座標資訊後,進行一次性渲染。

傳統渲染處理是這樣的:不同的切換紋理,不同地載入和渲染。而批次處理是一次載入完所有紋理,然後一次渲染,這樣效率就提高了。

資源快取

CCSpriteFrameCache
CCTextureCache
快取比較耗電量,所以,一般使用完,就會呼叫remove函式。而且在預載入時要顯示進度條,可能會影響使用者體驗,應該根據情況使用。


記憶體優化


資源佔用的記憶體優化

如前面幾個小節所述

記憶體池方案

遊戲啟動的時候就分配很大的一塊區域,遊戲執行過程中不釋放,直到退出遊戲再釋放。平時不是為新資源分配記憶體,而是把資源載入到記憶體池裡面。多次使用的時候,就不用經過多次的釋放和重新載入。這部分可以多瞭解下C++的記憶體池管理機制。

相關文章