cocos2d x學習筆記18 記憶體管理01 概述

2021-09-05 07:17:49 字數 3165 閱讀 4353

一、概述

cocos2d-x最初移植自cocos2d的objective c版本。因此,在記憶體管理上,使用了和nsobject類似的引用計數器方法,相關介面放置在ccobject類中。

二、引用計數器——手動管理記憶體

ccobject的及其子類的

物件在建立時,引用計數自動設定為1。之後每次呼叫retain,引用計數+1。每次呼叫release,引用計數-1;若引用計數=0,則直接delete this。

//引用次數+1

virtual

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方法。

virtual

void 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,這個類...