一、cocos2dx之如何優化內存使用(高級篇)


本文由qinning199原創,轉載請注明:http://www.cocos2dx.net/?p=93

一、內存優化原則

 

為了優化應用內存,你應該知道是什么消耗了你應用的大部分內存,答案就是Texture(紋理)!它幾乎占據了90%的應用內存。那么我們應該盡力去減小我們應用的紋理內存使用,否則我們的應用進程可能會被系統殺死。

為了減少內存警告,這里我們給出兩個普遍的關於cocos2dx游戲內存優化的指導原則。

1)了解瓶頸,然后解決掉

什么樣的紋理消耗了大部分應用的內存呢?或者說這些紋理消耗了多少內存呢?你不用去手工計算或者猜測。

這里我們正好有一個工具。它就是蘋果的開發工具- Allocations & Leaks,在xcode中你長按Run按鈕並且選擇Profile去啟動這兩個工具。這里我們有個截圖:

 

你可以使用Allocation工具去計算你應用的內存使用情況並且可以查看內存泄露情況。

你也可以用一些代碼去獲取游戲內存使用的一些有用的信息。

如下代碼即可:

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)不要過度優化

這是一個常規的優化規則。當你進行內存優化的時候,你應當進行一下權衡。因為有時圖片質量和圖片內存使用情況是相反的兩邊。所以千萬不要過度優化。

二、內存優化等級

這里我們把cocos2dx內存優化划分成三個等級。在每個等級,我們有不同觀點並且策略也是有些變化。

1、cocos2dx 客戶端等級

這是我們可以關心的最重要的優化等級。因為我們在cocos2dx引擎上開發游戲,引擎自己就提供了很多可選擇的優化方案。在這個等級上,我們可以做的工作最多。

首先,讓我們看一下紋理優化

為了優化紋理內存的使用,我們必須知道什么因素影響了內存的使用情況。

有三個因素影響了紋理的內存使用。紋理格式(壓縮的還是非壓縮的),顏色,大小。

我們可以使用PVR格式的紋理來減少內存使用。最被建議的紋理格式是pvr.ccz,每色的bit值越高,畫面質量就約好。但是也會消費很多內存。

那么我們使用顏色深度是RGBA4444的紋理來代替RBGA8888,這將會消費一半內存。

我們也會發現大紋理也會導致內存相關的問題。那么你最好使用適度的大小。

其次,讓我們做一些關於聲音的事情

有三個因素影響文件內存使用。是音頻文件格式,比特率,和樣本率

我們最希望音頻文件時mp3格式。因為它被android和ios都支持。並且它也被壓縮並且硬件加速了。

你應該保證你的背景音樂文件大小在800KB一下。最簡單的方式就是減少背景音樂播放時間並且重復調用。

你應該保持你的音頻文件樣本率在96-128kbps之間,並且比特率在44kHz就足夠了。

最后,我們談談字體和粒子系統優化。

這里我們有兩個建議:當使用BM字體顯示游戲分數,在你的圖片文件中選擇最小的數字字符,例如:

如果你想只顯示數字,你可以移除所有的字符。

粒子系統中,我們可以減少粒子數量來減少內存使用。

2、cocos2dx引擎等級

如果你不擅長OpenGLES和游戲引擎內核,你可以把這部分留個引擎開發者。如果你是一個開源游戲引擎愛好者,如果你已經做了引擎等級的一些優化,請告知引擎開發者們!

3、c++語言等級

在這個等級,我的建議就是寫一些無內存泄露的代碼。使用cocos2dx引擎內存管理工具並且盡最大努力避免內存泄露。

三、建議和技巧

1、一幀幀的加載游戲資源。

2、減少繪制調用。使用CCSpriteBatchNode

3、按照最大到最小的順序的加載紋理

4、避開內存使用高峰、

5、使用加載界面來預加載游戲資源。

6、當不需要的時候釋放無用的資源

7、當有內存警告的時候釋放緩存的資源

8、使用texturePacker來優化紋理尺寸,格式,色彩深度值等等。

9、小心使用JPG文件

10、使用16位RBGA4444色彩深度的紋理

11、使用NPOT紋理代替POT紋理

12、避開加載大尺寸圖片

13、使用1024*1024 NPOT pvr.ccz紋理圖集而不是原生圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM