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...