cocos記憶體管理

2021-07-10 18:42:23 字數 1170 閱讀 1270

c語言的記憶體管理:

申請記憶體 malloc,釋放記憶體free

c++申請記憶體 new 釋放記憶體用delete

cocos2dx

申請記憶體用create之後就不管了,其原因是因為create函式呼叫了autorelease(當然本質上仍然是用new申請記憶體和delete釋放,只是cocos通過機制自動化了上述操作)

1. autorelease是用於智慧型管理釋放的

2. autorelease是定義的在ref類中(ref類就是專門做記憶體管理)

ref類:(所有物件的根類,每個物件都繼承自它)

ref::_referencecount 引用計數器,記錄著該物件被引用的次數,如:

a物件,b物件使用到了a物件,那麼就叫b引用了a

c物件也是用了a物件,那麼就叫c引用了a

ref::_referencecount 初始化時為1,這個1表示自引用(在建構函式中)

ref::retain介面(方法)負責將ref::_referencecount加1,表示有其他物件引用

ref::release函式負責將ref::_referencecount減一,當為0時,delete掉當自己

所以release是釋放記憶體的函式。其中有delete

ref::autorelease是將物件自己放入到記憶體管理池(記憶體管理池本身就是乙個棧,其中有好多

記憶體池,通過getcurrentpool獲取棧頂池,池子本身實質上是乙個存放ref物件的vector,其操作就是將該物件放進物件vector)

放入管理池的意義在於:如果該物件在這個幀迴圈沒有被別的物件引用的話,那麼該物件在這個幀迴圈結束時被刪除

其實就是這個幀沒有用這個物件,則刪除物件。

director->mainloop()中的poolmanager::getinstance()->getcurrentpool()->clear();完成每一幀的池處理

retain,release,autorelease這些函式一般來說不需要我們自己呼叫,需要了解哪些介面呼叫了這些函式

綜上可知:addchild函式的子函式pushback呼叫了retain,所以新增子節點會增加對物件的引用

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