從零開始 cocos2dx生活(一)記憶體管理

2021-09-26 04:01:34 字數 2253 閱讀 5775

cocos中所有的物件都是繼承自ref基類,ref的職責就是對物件進行引用計數管理

記憶體管理中最重要的是三個方法retain()、release()、autorelease()

在cocos中建立物件的標準流程是:

建立物件->初始化->新增到自動記憶體管理->返回建立成功的物件

就比如下面這段**1:建立node物件

//**1

node * node::

create()

else

return ret;

}

在**1中,我們只需要呼叫create方法就可以實現建立物件、初始化和自動管理記憶體。

在cocos中有的函式中直接使用了create的巨集定義,呼叫物件的create方法就可以執行**2,實現的功能和**1是一樣的。

//**2

#define create_func(__type__) \

static __type__* create() \

\ else \\}

**2中呼叫autorelease方法,將物件加入自動記憶體管理池自動管理。

**3是autorelease方法的實現

//**3

ref* ref::

autorelease()

首先看一下**4,poolmanager的getinstance方法

在**4中建立了poolmanager物件並呼叫了this的autoreleasepool方法(**5)

"cocos2d autorelease pool"是這個自動管理池的name

//**4

poolmanager* poolmanager::

getinstance()

return s_singleinstance;

}

在**5中可以看到先是對_managedobjectarray預留空間,然後將this加了進去

//**5

autoreleasepool::

autoreleasepool

(const std::string &name)

:_name

(name)

#if defined(cocos2d_debug) && (cocos2d_debug > 0)

,_isclearing

(false

)#endif

在**3中還呼叫了getcurrentpool方法用來獲取當前的記憶體管理池

//**6

autoreleasepool* poolmanager::

getcurrentpool()

const

然後把this加入到當前的記憶體管理池中作為乙個ref物件進行管理,如**7

//**7

void autoreleasepool::

addobject

(ref* object)

整個流程如下圖所示

自動記憶體管理的結構如下圖,用乙個棧來儲存多個自動記憶體管理池,在自動記憶體管理池中又有若干個ref物件。

在記憶體管理中主要是靠引用計數來記錄物件的使用情況,當乙個物件被create時會給它分配記憶體,並且會呼叫retain()方法讓引用計數+1;當呼叫release()時會讓引用計數-1,release時會檢查引用計數是否為0,引用計數為0時會呼叫delete刪除物件並釋放記憶體。

在每一幀結束時會清理當前的記憶體管理池,將每乙個ref物件的引用計數都-1,這幀結束之後,記憶體管理池中就沒有這個ref物件了,引用計數是ref自己的屬性,當下一次被release時如果引用計數=0,就會被釋放。

void director::

mainloop()

}void autoreleasepool::

clear()

}

retain()和release()只是幫助我們記錄乙個物件的引用次數,在程式中幾乎不用手動呼叫。

Cocos2d x學習小結 開始篇

想要學習cocos2d x,是因為在高中物理課上找不到某些物理定律的證明,例如歐姆定律。為此,我翻閱了稍高等級的物理教材,其中關於歐姆定律 r frac 的證明大體如下 把金屬導體中的質子視作相對靜止構成點陣的剛體,把電子視作可以在質子周圍自由穿梭,不時與質子進行完全彈性碰撞的剛體。當導體中沒有電場...

cocos2d x 學習筆記 一

最近有點閒,突然想嘗試搞搞手機遊戲方面的開發,於是下了個cocos2d x 2.2.6和 cocos2d x權威指南 先看書,翻了下目錄尼瑪16章。厄,對於這種工具框架類的學習,貌似我從來沒有按部就班慢慢學的習慣 照例,花了2,3小時看下大概概念,記錄下 1,背景知識,過 2,環境搭建,cocos2...

Cocos2d x 學習日記 一

csv被稱為 逗號分隔值 comma separated values,csv csv格式比較簡單,解碼使用字串的擷取和分析就可以完成,使用 stringf和 array等ref類,解析csv比較方便。string有如下函式 array componentsseparatedbystring con...