-- 不要怕,勇敢的邁出第一步,加油!!!!!--
此章介紹cocos2d 中的記憶體管理
1. cocos2d 中的所有node類都繼承於ref,ref中有引用計數的概念,如下:
class testref : public ref
virtual ~testref() {}
new testref -- 這時class ref 中的_referencecount = 1
retain -- _referencecount++
release -- _referencecount--, 如果_referencecount == 0, 析構這個class
autorelease -- 把this 放入poolmanager 記憶體池中. 當poolmanager**時,就會把這個class**到,並且析構。
例子1auto p = new testref(); _referencecount = 1
p->retain(); _referencecount = 2
p->release(); _referencecount = 1
p->release(); _referencecount = 0, 析構p
例子2auto p = new testref(); _referencecount = 1
p->autorelease(); 當poolmanager**時,就會把這個class**到,並且析構。
這個就是cocos2d 中的記憶體管理。
如果我們在使用一些sprite,layer,scene時,在addchild的前後,如果不是特殊需要,不要呼叫其retain或者release,因為在建立後,這個元件都呼叫了autorelease,並在其父節點釋放後,其子節點都會釋放的。
2. 不要在元件的繼承類中儲存如何的非node類的成員變數,什麼意思呢?如下,這裡只是簡單的描述一下哈,
class testlayer : public layer
create_func(fight);
private:
testref *t;
bool testlayer::init() {
if (!layer::init())
return false;
t = new testref();
return true;
把當前的testlayer加入scene中,然後程式退出,scene和testlayer都會被析構掉。在testlayer的析構中,我們要把testref也析構掉,但是在testlayer的析構函式斷點中,我看到 t 是乙個無效的指標,並且testref的析構函式沒有被呼叫過,「記憶體洩露」了,懷疑如下:僅供個人參考,如果有人知道具體答案,請告知,謝謝~~~~
在testlayer析構之前,其內部的所有子元件都會被析構掉,並且其所有成員變數都被重置成野指標,這是什麼原因,我還沒有搞清楚,記憶體洩露,程式退出時就會掛掉,大家可以根據這個,判斷其是否記憶體洩露,什麼地方記憶體洩露,還是很有用的。
結論:1. cocos2d 的記憶體管理有效的解決某些童鞋忘掉釋放記憶體的習慣,當然這個習慣不好哈。
2. 不能在元件的繼承類中儲存任何成員變數的物件,謹記。
cocos2d 優化記憶體使用
為優化應用記憶體使用,開發人員首先應該知道什麼最耗應用記憶體,答案就是紋理!紋理幾乎會佔據90 應用記憶體。所以盡量最小化應用的紋理記憶體使用,否則應用很有可能會因為低記憶體而崩潰。本文介紹cocos2d x遊戲通用的兩條記憶體優化原理指導。什麼樣的紋理最耗應用記憶體?或這些紋理會消耗多少記憶體?當...
cocos2d實現語音 Cocos2d 聲音API
param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...
Cocos2D研究院之初識Cocos2d(二)
在正式介紹cocos2d之前,我先囉嗦一下本人對這套引擎的看法。我認為coos2d最大的作用就是降低開發成本 貌似所有引擎都是這樣 對於研發部門來說,最大的成本就是時間,所以節省時間是降低成本最有效的方式,cocos2d幾乎封裝了所有開發ios遊戲需要的底層 使剛剛接觸oc的開發者也能很快的製作出效...