Cocos2d x 記憶體管理與資料結構

2021-07-26 08:17:35 字數 2210 閱讀 7625

cocos2d-x

記憶體管理與資料結構

cocos

採用的是引用計數的方式管理記憶體,

cocos

會記錄堆上每個物件被引用的次數,當引用次數為

0時則自動釋放記憶體。

為了實現對類引用次數的管理,

cocos

的類都繼承了

ref類。

class cc_dllref

;

為了實現記憶體的自動釋放

autoreleasepool

建立了記憶體池,記憶體池會記錄所有要自動釋放的記憶體。

class cc_dllautoreleasepool

;

main

函式呼叫的

run函式的迴圈呼叫了

director

->

mainloop

(),其每次繪製完後會清理記憶體

void displaylinkdirector::mainloop()

elseif(_restartdirectorinnextloop)

elseif(! _invalid)

}

當new

乙個物件後引用計數為

1,然後呼叫

ref::

autorelease

加入到自動管理記憶體池,物件會在下一次主迴圈時呼叫

ref::

release

。如果需要儲存物件一直使用則需要呼叫一次

ref::

retain

函式增加引用計數。例如:

//內部會呼叫 autorelease函式,create函式見下方**

auto sprite = sprite::create("helloworld.png");

this->addchild(sprite, 0);//內部會呼叫ref::retain函式增加引用計數

sprite* sprite::create(const std::string& filename)

cc_safe_delete(sprite);

return nullptr;

}

為了方便和統一

create

的定義函式,

cocos

提供了相

create_func

巨集,在類中加入該巨集及定義了

create

函式。

#definecreate_func(__type__) \

static__type__* create() \

\    else \

\}

例如:

classhelloworld: public cocos2d::layer

;    auto layer= helloworld::create();//create_func巨集定義的函式

scene->addchild(layer);

cocos

中vector

類是對c++ stl

中的std::vector

進行了一層封裝,其只有乙個變數

std::

vector

<

t>

_data

;之所以要重新封裝一層,是為了實現對引用計數記憶體的管理。

當向_data

陣列中新增資料時其會對呼叫物件的

ref::

retain

函式增加引用計數,從

_data

中刪除資料時會呼叫

ref::release

函式減少引用計數釋放釋放記憶體。

例如pushback

函式和popback

函式

voidpushback(t object)

voidpopback()

cocos2d::map

類是使用

std::unordered_map

作為底層結構的關聯式容器。在關聯式容器的基礎上進行封裝實現對引用計數記憶體的自動管理。

cocos2dx 記憶體管理

記憶體管理中經常遇到的問題 記憶體洩露,記憶體溢位。在cocos2dx中用的是引用計數和自動釋放池的技術,由於熟悉objective c語言,所以對這兩個概念不會很陌生。一 引用計數 引用計數是自動記憶體管理的基礎 在物件裡增加乙個引用計數,當外部引用增加時,計數器加1,當外部引用消失時,計數器減1...

cocos2d x 記憶體管理

呼叫了autorelease的物件,將會在自動 池釋放的時候被釋放一次。因為這個操作發生在 mainloop drawscene 後,這時候遊戲中所有的邏輯已經執行完畢,正是釋放無效資源的最佳時機。所以乙個物件被create後,將被放進pool中,其ref 數為1,當遊戲整個邏輯跑完,如果沒有增加r...

cocos2dx 記憶體管理

我們知道,cocos2dx中使用了引用計數的方式去管理記憶體,不需要我們手動delete的去釋放記憶體。那麼cocos2dx中是怎麼實現引用計數的記憶體管理方式的呢?cocos2dx中的記憶體管理用到了兩個工具 引用計數器 ref 自動 池 autoreleasepool 引用計數器 ref ref...