一、概述
cocos2d-x最初移植自cocos2d的objective c版本。因此,在記憶體管理上,使用了和nsobject類似的引用計數器方法,相關介面放置在ccobject類中。
二、引用計數器——手動管理記憶體
ccobject的及其子類的
物件在建立時,引用計數自動設定為1。之後每次呼叫retain,引用計數+1。每次呼叫release,引用計數-1;若引用計數=0,則直接delete this。
//引用次數+1virtual
void ccobject::retain(void);
//引用次數-1;若引用計數器=0,則delete this;
virtual
void ccobject::release(void);
//helper方法,快速判斷當前物件只有唯一引用
bool ccobject::issinglerefrence(void);
//返回引用次數
unsigned int ccobject::retaincount(void);
原則1:
誰生成(new、copy)誰負責release。
例子:
ccobject *obj=new ccobject;...
obj->release();
retain是在指標傳遞和賦值時使用的,他的含義是表示擁有。這經常用在指標賦值上。
原則2:
誰retain,誰負責release。
例子:
obj->retain();...
obj->release();
原則3:傳遞賦值時,需要先retain形參,後release原指標,最後賦值。(注意,因為這裡沒有使用自賦值檢查,所以這組順序不能錯。)
void ccnode::setgrid(ccgridbase* pgrid)三、自動釋放池——自動管理記憶體
原則4:對於使用autorelease的物件,不必管它,每幀結束後會自動釋放。
ccobject* ccobject::autorelease(void);例子:
ccobject *obj=new ccojbect;obj->autorelease();
...
ccpoolmanager。
將物件置於自動釋放池中,每幀繪製結束,就自動release池中的物件。
四、ccnode節點管理
cocos2d-x使用節點組成一棵樹,渲染的時候要遍歷這棵樹。ccnode是所有節點類的父類,他內部使用了乙個ccarray物件管理他的所有子節點,當物件被新增為子節點時,實際上是被新增到ccarray物件中,同時會呼叫這個物件的retain方法。同理,從ccarray中移除時,也會呼叫
release方法。
virtualvoid addchild(ccnode * child);
virtual
void addchild(ccnode * child, int zorder);
virtual
void addchild(ccnode * child, int zorder, int tag);
virtual
void removechild(ccnode* child, bool cleanup);
void removechildbytag(int tag, bool cleanup);
virtual
void removeallchildrenwithcleanup(bool cleanup);
在切換場景時,系統會遍歷整棵樹的節點,進行release。
五、靜態工廠
cocos2d-x中存在大量的靜態工廠方法,這些方法中,全都對this指標呼叫了autorelease函式。如ccsprite中的這些方法:
static ccsprite* spritewithtexture(cctexture2d *ptexture);static ccsprite* spritewithtexture(cctexture2d *ptexture, const ccrect& rect);
static ccsprite* spritewithtexture(cctexture2d *ptexture, const ccrect& rect, const ccpoint& offset);
static ccsprite* spritewithspriteframe(ccspriteframe *pspriteframe);
static ccsprite* spritewithspriteframename(const
char *pszspriteframename);
static ccsprite* spritewithfile(const
char *pszfilename);
static ccsprite* spritewithfile(const
char *pszfilename, const ccrect& rect);
static ccsprite* spritewithbatchnode(ccspritebatchnode *batchnode, const ccrect& rect);
這些方法內部實現了:記憶體分配、初始化、設定
autorelease。
用靜態工廠來生成物件,
可以簡化**,
是官方建議的方法。
六、cache機制類
cocos2d-x中存在一些cache類,這些都是單例類的管理器。
ccanimationcache
ccspriteframecache
cctexturecache
這些cache內部也使用了ratain和release方法,防止這些資源被釋放掉。
使用這些cache,我們可以儲存預載入的一些資源,在方便的時候呼叫它,去繫結給一些物件。注意,這些cache在場景切換時,不會自動刪除,需要手動呼叫purge***x方法,進行清理。
cocos2d x學習筆記18 記憶體管理01 概述
一 概述 cocos2d x最初移植自cocos2d的objective c版本。因此,在記憶體管理上,使用了和nsobject類似的引用計數器方法,相關介面放置在ccobject類中。二 引用計數器 手動管理記憶體 ccobject的及其子類的 物件在建立時,引用計數自動設定為1。之後每次呼叫re...
Cocos2d x學習筆記1
1.建立新的cocos2d x 3.0 專案 在命令列中輸入 cocos new helloworld 專案名稱 p com.ss.pku 包名字 l cpp 專案型別 d d cocos workspace 專案存放路徑 2.資料夾分析 resource 資料夾 存放資源檔案 include和so...
Cocos2d x學習筆記(7)
1 動作基本概念 ccactiong是動作類的基類,動作作用於ccnode,因此,任何乙個動作都需要ccnode物件來執行。ccaction作為乙個基類,其實質是乙個介面 抽象類 由它派生的實現類才是實際使用的動作。ccaction的絕大多數實現類都派生自ccfinitetimeaction,這個類...