本文由qinning199原創,轉載請註明:http://www.cocos2dx.net/?p=93android
1、內存優化原則ios
爲了優化應用內存,你應該知道是什麼消耗了你應用的大部份內存,答案就是Texture(紋理)!它幾乎佔據了90%的應用內存。那麼咱們應該盡力去減少咱們應用的紋理內存使用,不然咱們的應用進程可能會被系統殺死。c++
爲了減小內存警告,這裏咱們給出兩個廣泛的關於cocos2dx遊戲內存優化的指導原則。xcode
1)瞭解瓶頸,而後解決掉緩存
什麼樣的紋理消耗了大部分應用的內存呢?或者說這些紋理消耗了多少內存呢?你不用去手工計算或者猜想。工具
這裏咱們正好有一個工具。它就是蘋果的開發工具- Allocations & Leaks,在xcode中你長按Run按鈕而且選擇Profile去啓動這兩個工具。這裏咱們有個截圖:開發工具
你可使用Allocation工具去計算你應用的內存使用狀況而且能夠查看內存泄露狀況。字體
你也能夠用一些代碼去獲取遊戲內存使用的一些有用的信息。優化
以下代碼便可:spa
CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
以下所示:當你調用這些代碼而且在DEBUG模式運行你的遊戲的時候,在你的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顯示了紋理的名字,引用數,id,大小以及像素的bit值,最重要的是它展現了內存使用狀況。如上cc_fps_images消耗了16KB,actor.pvr.ccz消耗了16M內存。
2)不要過分優化
這是一個常規的優化規則。當你進行內存優化的時候,你應當進行一下權衡。由於有時圖片質量和圖片內存使用狀況是相反的兩邊。因此千萬不要過分優化。
2、內存優化等級
這裏咱們把cocos2dx內存優化劃分紅三個等級。在每一個等級,咱們有不一樣觀點而且策略也是有些變化。
一、cocos2dx 客戶端等級
這是咱們能夠關心的最重要的優化等級。由於咱們在cocos2dx引擎上開發遊戲,引擎本身就提供了不少可選擇的優化方案。在這個等級上,咱們能夠作的工做最多。
首先,讓咱們看一下紋理優化
爲了優化紋理內存的使用,咱們必須知道什麼因素影響了內存的使用狀況。
有三個因素影響了紋理的內存使用。紋理格式(壓縮的仍是非壓縮的),顏色,大小。
咱們可使用PVR格式的紋理來減小內存使用。最被建議的紋理格式是pvr.ccz,每色的bit值越高,畫面質量就約好。可是也會消費不少內存。
那麼咱們使用顏色深度是RGBA4444的紋理來代替RBGA8888,這將會消費一半內存。
咱們也會發現大紋理也會致使內存相關的問題。那麼你最好使用適度的大小。
其次,讓咱們作一些關於聲音的事情
有三個因素影響文件內存使用。是音頻文件格式,比特率,和樣本率
咱們最但願音頻文件時mp3格式。由於它被android和ios都支持。而且它也被壓縮而且硬件加速了。
你應該保證你的背景音樂文件大小在800KB一下。最簡單的方式就是減小背景音樂播放時間而且重複調用。
你應該保持你的音頻文件樣本率在96-128kbps之間,而且比特率在44kHz就足夠了。
最後,咱們談談字體和粒子系統優化。
這裏咱們有兩個建議:當使用BM字體顯示遊戲分數,在你的圖片文件中選擇最小的數字字符,例如:
若是你想只顯示數字,你能夠移除全部的字符。
粒子系統中,咱們能夠減小粒子數量來減小內存使用。
二、cocos2dx引擎等級
若是你不擅長OpenGLES和遊戲引擎內核,你能夠把這部分留個引擎開發者。若是你是一個開源遊戲引擎愛好者,若是你已經作了引擎等級的一些優化,請告知引擎開發者們!
三、c++語言等級
在這個等級,個人建議就是寫一些無內存泄露的代碼。使用cocos2dx引擎內存管理工具而且盡最大努力避免內存泄露。
3、建議和技巧
一、一幀幀的加載遊戲資源。
二、減小繪製調用。使用CCSpriteBatchNode
三、按照最大到最小的順序的加載紋理
四、避開內存使用高峯、
五、使用加載界面來預加載遊戲資源。
六、當不須要的時候釋放無用的資源
七、當有內存警告的時候釋放緩存的資源
八、使用texturePacker來優化紋理尺寸,格式,色彩深度值等等。
九、當心使用JPG文件
十、使用16位RBGA4444色彩深度的紋理
十一、使用NPOT紋理代替POT紋理
十二、避開加載大尺寸圖片
1三、使用1024*1024 NPOT pvr.ccz紋理圖集而不是原生圖片