Cocos2dx 記憶體管理機制(1)

2021-06-21 12:58:18 字數 3720 閱讀 8139

1.引用計數機制

要了解cocos2dx引用計數的機制,首先我們來看看ccobject這個類

class cc_dll ccobject : public cccopying

;

friend class ccautoreleasepool;

};

說明:● 

當m_ureference=0時會自動釋放該物件,每引用一次物件的時候,m_ureference會+1,當object被建立,會初始化為1. ● 

當m_uautoreleasecount !=0時表示該物件自動釋放(autorelease)。

●void retain(void) 對m_ureference+1操作,可以防止物件被釋放 ●

retaincount() 返回m_ureference值

● 跟蹤一下void release()方法,我們會發現是對引用計數m_ureference進行-1操作,為0時刪除物件

void ccobject::release(void)

}

2.使用引用計數手動管理記憶體

因此,如果我們想手動來管理記憶體的釋放,我們可以使用這樣子,

ccsprite* sprite1=new ccsprite();

sprite1->initwithfile("closenormal.png");

cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:1

this->addchild(sprite1); //addchild會對引用計數+1,可以跟蹤看一下,最後會對object->retain()操作

cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:2

sprite1->release();

cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:1

this->removechild(sprite1); //對m_ureference進行-1,跟蹤一下會發現對object進行cc_safe_release()安全釋放操作

cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:-17891602

new和release一般成對存在,

所以,new和release是好**!而手動記憶體管理一般不再使用retain。

3.自動管理autorelease

還記得helloworld裡面怎麼建立乙個sprite嗎?

ccsprite* psprite = ccsprite::create("helloworld.png");

跟蹤ccsprite::create()

ccsprite* ccsprite::create(const char *pszfilename)

cc_safe_delete(pobsprite);

return null;

}

上上面我們可以知道 : 

create=new+autorelease

那麼autorelease是什麼呢,我們接著跟蹤進入autorelease方法:

ccobject* ccobject::autorelease(void)

進入其中的addobject方法

void ccpoolmanager::addobject(ccobject* pobject)

再進入

addobject方法

void ccautoreleasepool::addobject(ccobject* pobject)

然後我們可以發現倆個類:

ccpoolmanager  

物件自動管理類,這個類顧名思義就知道是對

物件自動釋放池進行管理的類,它是乙個單例類,這裡用來返回ccautoreleasepool  

ccautoreleasepool  

物件自動管理(釋放)池。

從上面我們可以看到這樣一句,將object新增到m_pmanagedobjectarray 陣列

m_pmanagedobjectarray->addobject(pobject);

我們來看一下ccautoreleasepool  這個類

class cc_dll ccautoreleasepool : public ccobject

;

值得注意的是,這個類也是繼承自ccobject

,那麼顯然其記憶體管理形式也採用引用計數的。

這時看到類中的 

m_pmanagedobjectarray 

陣列,我們將物件autorelease後,都是將物件新增到這個陣列中的,所以說是物件自動管理(釋放)池。

再來回顧一下前面這個addobject方法

void ccautoreleasepool::addobject(ccobject* pobject)

首先是將物件新增到陣列中,然後將物件自動管理變數++,那麼物件的 m_uautoreleasecount =1,也就是表明其為自動管理物件。

然後對物件進行release,也即對物件的引用計數進行減1的操作,至於為什麼要釋放,這裡解釋下:

①首先乙個ccsprite物件被建立,使用的是new,那麼其引用計數 m_ureference=1。這個應該不難理解吧:ccsprite是繼承自ccobject,而在前面ccobject的構造方法中就知道,new建立乙個例項物件後,其引用計數m_ureference=1,而是否自動管理變數 m_uautoreleasecount=0(表示物件未新增到自動管理(釋放)池中自動管理)。

②接著物件autorelease,那麼就是將物件新增到自動釋放池中,而其中的:

m_pmanagedobjectarray

->

addobject

(pobject); 將被管理物件新增到自動管理池中的過程中(將物件新增到陣列中),其會對物件進行retain操作的,所以 m_ureference 就變成了 m_ureference=2。

③所以最後的release是為了將引用計數重新變成為1。這樣的話,從物件建立,到被放到物件自動管理池,引用計數依然為1,被管理值也為1(表徵物件是自動管理)。

不信的話,下面我們來跟蹤一下m_pmanagedobjectarray

->

addobject

(pobject)

void ccarray::addobject(ccobject* object)

進入

在進入

看到object->retain()方法了吧。

cocos2d x記憶體管理機制

c 記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被 造成記憶體洩露 npc n1 new npc if exit 0 cocos2d x 記憶體管理的方式,cocos2d x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為...

cocos2dx 記憶體管理機制(2)

首先我們要知道,cocos2d x的引擎執行緒是單執行緒的,它不停的呼叫乙個主迴圈來繪製當前的scene 同時對一些自動釋放的物件進行管理。一 現在開始定位,我們知道win32 下cocos2dx程式入口 run方法裡面有這麼一句 ccdirector shareddirector mainloop...

cocos2dx 學習( )記憶體管理機制

一 題記 關於cocos2dx 的記憶體管理機制,想必大家都能清楚說出是通過引用計數 reference count 和自動釋放池 autoreleasepool 但是不知大家是否知道其中具體的執行的細節呢?反正在寫這篇blog之前我是一知半解的,而且在粗略的看了下 poolmanager 的原始碼...