cocos2dx記憶體管理解析

2021-06-29 11:34:15 字數 2448 閱讀 2065

今天第一天開始寫部落格,我想我也會一直的堅持堅持下去,和所有人進行分享和交流,這也是源於對技術的熱愛和對遊戲的熾熱,我想我的這一生都將會奉獻給遊戲,他是我一輩子的事業更是我這輩子的朋友,好了廢話就不多說了,第一篇部落格我們就來聊聊cocos2dx的記憶體管理。

我們首先來看下下面的**片段

class ref

;而看cocos2dx裡面所有的顯示物件的基類node也都公有的繼承了ref(在cocos2dx3.0以下是ccobiect),於是所有的顯示物件也都有具有這三個方法,而在看看這三個方法的實現

void ref::retain()

void ref::release()

delete this;

}}ref* ref::autorelease()

了解object-c的人通過上面的**應該都能夠明白cocos2dx-c的記憶體管理其實是和object-c的一模一樣的,都是採用引用計數的方法來管理自己的記憶體的,當建立乙個物件的時候他的引用計數器_referencecount會加一,不要問我為什麼,因為_referencecount在建構函式被初始化了1,在看下面建立乙個顯示物件的**

layer *layer::create()

else

}

這是建立乙個層的**new layer 這個物件的記憶體快,init初始化這個類裡面的邏輯函式或者變數,然後autorelease然後返回,為什麼要autorelease呢,看看autorelease這個函式的實現

ref* ref::autorelease()

原來是把這個物件也就是這個記憶體快新增到乙個全域性的poolmanager裡面,而為什麼要新增到poolmanager這裡面呢,看看poolmanager就一目了然

autoreleasepool* poolmanager::getcurrentpool() const

是獲取得到乙個 poolmanager 裡面autoreleasepool物件,並且把顯示物件新增到autoreleasepool物件裡面的集合物件中(此處我也不太明白作者的用意,單利物件本來就只有乙個例項,為毛_releasepoolstack還是乙個集合,每次都要拿集合最後的乙個autoreleasepool,而框架由始至終都只往_releasepoolstack集合中新增了一autoreleasepool物件);這樣只要經過autorelease的函式就會新增到poolmanager裡面來,而為什麼要這樣做呢,當然肯定是為了更好的管理記憶體,而在什麼地方管理呢,我們知道cocos2d他只有乙個主線程,在那呢,我們找找

void

displaylinkdirector::mainloop()

else

if (! _invalid)

}

我們看到了poolmanager::getinstance()->getcurrentpool()->clear();這一句,其他的我們以後章節在來講他們的願意,本章節我們只看框架的記憶體管理模組,我們繼續看poolmanager裡面的clear方法

void autoreleasepool::clear()

_managedobjectarray.clear();

}

他會呼叫所有新增到autoreleasepool物件的release方法,看來release非常重要,我們繼續研究release方法

if (_referencecount == 0)

這下應該能夠一目了然了,當顯示物件的引用計數器為0的時候他就會自動的刪除自己,所以這樣就能夠很巧妙的管理建立或者說是new出來的物件了,而當什麼時候引用計數器會加1什麼時候會減1呢我們繼續深入的研究

void node::insertchild(node* child, int z)

當乙個物件往另外乙個物件上新增時,都會呼叫addchild方法,而addchild必呼叫insertchild方法,而insertchild方法其中的 _children.pushback(child)這一句

void pushback(t object)

他會呼叫retain方法,retain會將引用計數器加1現在_referencecount = 2,而當移除顯示物件時必須會呼叫removechild,則他同時也會呼叫release()函式,此時_referencecount會–_referencecount會變成1,當程式執行下一幀的時候,他繼續會–_referencecount;然後當_referencecount = 0的時候就會刪除此物件

這樣就構成了乙個先是物件從產生到銷毀的整個過程,所以當我們使用的時候就一定要注意了,手動retain的使用完畢後,必須要手動呼叫release(),否則他永遠不會刪除這段記憶體,從而造成記憶體洩漏。

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