cocos2d x記憶體管理機制解析(一)

2021-09-06 14:06:42 字數 2800 閱讀 6212

前言:c++記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被**,造成記憶體洩露。

我們來舉個例子說明一下:

執行 結果,vld工具提示了存在記憶體洩露:

當加上delete操作後:

下面步入正題:

1、cocos2d-x 記憶體管理的方式,cocos2d-x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為0的時候,就會被引擎自動delete掉。

所有cocos2d-x裡面的類都繼承ccobject類(應該是吧、),下面看ccobject類原始碼:

這裡 m_ureference 就是引用計數,在物件構造的時候,m_ureference置為1

然後每次對物件進行retain操作,reference+1

每次對物件進行release操作,reference-1,如果reference在這次release之後變為0,那麼delete掉它

2、以上是記憶體管理的基本原則,下面來講引擎中是怎麼對物件進行自動管理(autorelease)的。

我們以乙個ccnode的生命歷程為例,來講一下自動管理的整個過程:

首先建立乙個ccnode:

ccnode物件被new出來之後,立刻執行autorelease操作,我們來進行跟蹤:

可以看到,首先將m_bmanaged置為true,表示處於自動管理狀態,然後加入自動管理池,繼續跟蹤:

getcurreleasepool() 返回乙個 ccautoreleasepool 物件指標,也就是乙個自動釋放池,那麼我們先去看看這個自動釋放池裡面有什麼:

首先就是乙個ccobject陣列,m_pmanagedobjectarray , 這個陣列放的就是接受自動釋放的物件,也就是說,進行autorelease的物件,最終被放到它裡面去了

那我們注意一下這裡,m_pmanagedobjectarray 是乙個 ccmutablearray 物件,它的addobject()方法除了把乙個物件放到這個array裡面去,還做了什麼呢,我們來看看原始碼:

大家應該看到了,進行了一次retain()操作,使得物件的引用+1,那麼物件在被add到這個array裡之後,引用應該為2(不考慮其他地方進行的retain),所以在此之後立刻進行了一次release(),使得這次add造成的引用取消,這樣一來,物件從建立開始引用為1,到現在被放進自動釋放池中後,引用依然為1,同時,被管理狀態為true。

那麼我再進行深入的分析一下

getcurreleasepool()->addobject(pobject);

裡面的getcurreleasepool()方法,注意這個方法是 ccpoolmanager 的方法:

那麼我看到 ccpoolmanager 類,顧名思義,我們也想得到它是對自動釋放池進行管理的類,這是個全域性變數,在main()函式執行之前由系統自動呼叫其預設構造方法進行例項化。下面進入這個類去看看裡面有些什麼:

我們發現了,裡面有乙個 ccautoreleasepool 物件 m_pcurreleasepool, 看它名字, 可以理解為 當前自動釋放池 ,然後有乙個記憶體池的陣列 m_preleasepoolstack ,裡面放的就是多個記憶體釋放池了(我好像就看到乙個進去了)。那麼我們連上剛才的思路,進去看看push()函式,做了什麼事情:

如**所示,push()操作new了乙個自動釋放池物件,並且將它賦值給 當前自動釋放池(m_pcurreleasepool),然後將這個new的自動釋放池物件放到ccpoolmanager 裡面的 釋放池陣列中。注意過程中對其引用計數的控制,自動釋放池本身也是繼承ccobject的,也有自己的引用計數,受相同的記憶體管理方式。

那麼到這裡,乙個物件的autorelease()過程就完成了。

那麼我來做乙個簡單的總結:

首先 new 乙個物件, 然後執行其autorelease()方法,接下來是得到ccpoolmanager 物件(這是乙個全域性的物件),用它的getcurreleasepool獲取 當前自動釋放池物件,並將這個new的物件放入 當前自動釋放池物件 裡面的m_pmanagedobjectarray陣列中,修改其被管理狀態 m_bmanaged 為 true。執行完這個完整的操作之後,這個新new出來的物件的引用次數為1,被管理狀態為true,並且被放在乙個管理物件的陣列中。

cocos2d x記憶體管理機制

c 記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被 造成記憶體洩露 npc n1 new npc if exit 0 cocos2d x 記憶體管理的方式,cocos2d x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為...

cocos2dx 記憶體管理機制(2)

首先我們要知道,cocos2d x的引擎執行緒是單執行緒的,它不停的呼叫乙個主迴圈來繪製當前的scene 同時對一些自動釋放的物件進行管理。一 現在開始定位,我們知道win32 下cocos2dx程式入口 run方法裡面有這麼一句 ccdirector shareddirector mainloop...

Cocos2dx 記憶體管理機制(1)

1.引用計數機制 要了解cocos2dx引用計數的機制,首先我們來看看ccobject這個類 class cc dll ccobject public cccopying friend class ccautoreleasepool 說明 當m ureference 0時會自動釋放該物件,每引用一次...