一、內(nèi)存優(yōu)化原則
為了優(yōu)化應(yīng)用內(nèi)存,你應(yīng)該知道是什么消耗了你應(yīng)用的大部分內(nèi)存,答案就是Texture(紋理)!它幾乎占據(jù)了90%的應(yīng)用內(nèi)存。那么我們應(yīng)該盡力去減小我們應(yīng)用的紋理內(nèi)存使用,否則我們的應(yīng)用進(jìn)程可能會被系統(tǒng)殺死。
為了減少內(nèi)存警告,這里我們給出兩個普遍的關(guān)于cocos2dx游戲內(nèi)存優(yōu)化的指導(dǎo)原則。
1)了解瓶頸,然后解決掉
什么樣的紋理消耗了大部分應(yīng)用的內(nèi)存呢?或者說這些紋理消耗了多少內(nèi)存呢?你不用去手工計(jì)算或者猜測。
這里我們正好有一個工具。它就是 Allocations & Leaks,在xcode中你長按Run按鈕并且選擇Profile去啟動這兩個工具。這里我們有個截圖:
你可以使用Allocation工具去計(jì)算你應(yīng)用的內(nèi)存使用情況并且可以查看內(nèi)存泄露情況。
你也可以用一些代碼去獲取游戲內(nèi)存使用的一些有用的信息。
如下代碼即可:
CCTextureCache::sharedTextureCache()-》dumpCachedTextureInfo();
如下所示:當(dāng)你調(diào)用這些代碼并且在DEBUG模式運(yùn)行你的游戲的時(shí)候,在你的xcode console窗口你將會看到一些格式化的log信息
Cocos2d: cocos2d: “cc_fps_images” rc=5 id=3 256 x 32 @ 16 bpp =》 16 KB
Cocos2d: cocos2d: “XXX/hd/actor.pvr.ccz” rc=1059 id=4 2048 x 2048 @ 32 bpp =》 16384 KB
Cocos2d: cocos2d: CCTextureCache dumpDebugInfo: 2 textures, for 16400 KB (16.02 MB)
這些log顯示了紋理的名字,引用數(shù),id,大小以及像素的bit值,最重要的是它展示了內(nèi)存使用情況。如上cc_fps_images消耗了16KB,actor.pvr.ccz消耗了16M內(nèi)存。
2)不要過度優(yōu)化
這是一個常規(guī)的優(yōu)化規(guī)則。當(dāng)你進(jìn)行內(nèi)存優(yōu)化的時(shí)候,你應(yīng)當(dāng)進(jìn)行一下權(quán)衡。因?yàn)橛袝r(shí)圖片質(zhì)量和圖片內(nèi)存使用情況是相反的兩邊。所以千萬不要過度優(yōu)化。
二、內(nèi)存優(yōu)化等級
這里我們把cocos2dx內(nèi)存優(yōu)化劃分成三個等級。在每個等級,我們有不同觀點(diǎn)并且策略也是有些變化。
1、cocos2dx 客戶端等級
這是我們可以關(guān)心的最重要的優(yōu)化等級。因?yàn)槲覀冊赾ocos2dx引擎上開發(fā)游戲,引擎自己就提供了很多可選擇的優(yōu)化方案。在這個等級上,我們可以做的工作最多。
首先,讓我們看一下紋理優(yōu)化
為了優(yōu)化紋理內(nèi)存的使用,我們必須知道什么因素影響了內(nèi)存的使用情況。
有三個因素影響了紋理的內(nèi)存使用。紋理格式(壓縮的還是非壓縮的),顏色,大小。
我們可以使用PVR格式的紋理來減少內(nèi)存使用。最被建議的紋理格式是pvr.ccz,每色的bit值越高,畫面質(zhì)量就約好。但是也會消費(fèi)很多內(nèi)存。
那么我們使用顏色深度是RGBA4444的紋理來代替RBGA8888,這將會消費(fèi)一半內(nèi)存。
我們也會發(fā)現(xiàn)大紋理也會導(dǎo)致內(nèi)存相關(guān)的問題。那么你最好使用適度的大小。
其次,讓我們做一些關(guān)于聲音的事情
有三個因素影響文件內(nèi)存使用。是音頻文件格式,比特率,和樣本率
我們最希望音頻文件時(shí)mp3格式。因?yàn)樗?a target="_blank">android和ios都支持。并且它也被壓縮并且硬件加速了。
你應(yīng)該保證你的背景音樂文件大小在800KB一下。最簡單的方式就是減少背景音樂播放時(shí)間并且重復(fù)調(diào)用。
你應(yīng)該保持你的音頻文件樣本率在96-128kbps之間,并且比特率在44kHz就足夠了。
最后,我們談?wù)勛煮w和粒子系統(tǒng)優(yōu)化。
這里我們有兩個建議:當(dāng)使用BM字體顯示游戲分?jǐn)?shù),在你的圖片文件中選擇最小的數(shù)字字符,例如:
如果你想只顯示數(shù)字,你可以移除所有的字符。
粒子系統(tǒng)中,我們可以減少粒子數(shù)量來減少內(nèi)存使用。
2、cocos2dx引擎等級
如果你不擅長OpenGLES和游戲引擎內(nèi)核,你可以把這部分留個引擎開發(fā)者。如果你是一個開源游戲引擎愛好者,如果你已經(jīng)做了引擎等級的一些優(yōu)化,請告知引擎開發(fā)者們!
3、c++語言等級
在這個等級,我的建議就是寫一些無內(nèi)存泄露的代碼。使用cocos2dx引擎內(nèi)存管理工具并且盡最大努力避免內(nèi)存泄露。
三、建議和技巧
1、一幀幀的加載游戲資源。
2、減少繪制調(diào)用。使用CCSpriteBatchNode
3、按照最大到最小的順序的加載紋理
4、避開內(nèi)存使用高峰、
5、使用加載界面來預(yù)加載游戲資源。
6、當(dāng)不需要的時(shí)候釋放無用的資源
7、當(dāng)有內(nèi)存警告的時(shí)候釋放緩存的資源
8、使用texturePacker來優(yōu)化紋理尺寸,格式,色彩深度值等等。
9、小心使用JPG文件
10、使用16位RBGA4444色彩深度的紋理
11、使用NPOT紋理代替POT紋理
12、避開加載大尺寸圖片
13、使用1024*1024 NPOT pvr.ccz紋理圖集而不是原生圖片
評論
查看更多