關於cocos2d x 資源釋放問題

2021-07-10 02:10:04 字數 2020 閱讀 4832

前言:我的第一篇部落格,希望以後能夠分享更多的好的東西!!!

關於資源釋放的問題,首先要了解cocos2d-x 場景切換過程,這樣才知道什麼時候釋放才是合適的。有a,b兩個場景,假如從a切換到b,那麼順序如下:

切換時無特效,即ccdirector::shareddirector()->replacescene(b):

1.b->init()

2.a->

onexittransitionstart()

3.a->onexit()

4.b->onenter()

5.b->

onentertransitionfinish()

到此,b的場景建立完畢。再看有特效時,即ccdirector::shareddirector()>replacescene(

cctransitionjumpzoom::create(1.0f,b)

);1.b->init()

2.a->

onexittransitionstart()

3.b->onenter()

4.a->onexit()

5.b->

onentertransitionfinish()

看到上面的區別了吧,2,3步驟置換了下。

下面切換到正題,我們知道遊戲中主要吃掉記憶體的是紋理,考慮到渲染浪費時間的問題,所以用到的小盡量用工具texturepacker生成大,由於texturepacker生成的尺寸是2指數倍如:256*256。所以要規劃下,哪些要生成在其中,避免生成的尺寸過大,徒勞增加包體大小。

專案中可能用到很多快取類:如ccspriteframe,ccanimationcache,cctexturecache等,大多數情況下,最終占用資源的是cctexturecache,場景中 所有用到的最終都會生成在此快取中。當多種快取類存在情況下,刪除是有先後順序的,如果直接釋放cctexturecache,那麼將會其他描述快取找不到資源而引發程式的崩潰。在我的專案中用到了cocostudio做的動畫,使用到了cocos2d-x引擎下的extensions下的控制項。所以我的釋放順序是:

1.guireader::sharereader()->purge(); 

控制項描述檔案json解析類,即guireader,guireader物件建立時,沒有引用計數的記憶體管理模式,所以手動呼叫purge(),銷毀物件

2.ccarmaturedatamanager::sharedarmaturedatamanager()->purge();

骨骼動畫資料快取清除,追到purge()內檢視: 

ccspriteframecachehelper::purge(); 對s_spriteframecachehelper物件的安全銷毀

ccdatareaderhelper::purge();對s_arrconfigfilelist(實際上是vector)進行clear  和 s_datareaderhelper 銷毀

cc_safe_release_null(s_sharedarmaturedatamanager); 自身物件資料銷毀

3.ccanimationcache::sharedanimationcache()->purgesharedanimationcache();

對動畫快取物件安全釋放,其中最主要釋放的是ccdictionary成員

4.ccspriteframecache::sharedspriteframecache()->purgesharedspriteframecache();

釋放幀快取

5.cctexturecache::sharedtexturecache()->purgesharedtexturecache();

最後釋放紋理

以上就是資源釋放順序,那麼這段程式放在a->b場景切換的哪個函式中呢?我的選擇是在b的建構函式、init()其中的一處,當然這段程式一定要放在其他資源建立之前(如按鈕的建立等)。如果a,b場景中有共用資源,資源分的不是那麼清怎麼辦呢。。。。也不怕,在這段程式之後再次載入,由於載入資源是乙個讀檔案的過程,比較費時,可以選擇非同步載入 或是 根據場景用到資源順序,在每隔一段時間載入一部分資源。

cocos2d x 資源集合

官網 主席子龍山人 archive 2011 08 08 2131019.html kmyhy的專欄 老g的小屋 cocos2d xtouch事件cocos2d 事件冒泡規律 和 ccmenu一直響應事件的解決辦法 swallow touches how to setmultipletouchena...

關於cocos2dx中tableView的一些理解

先看 h檔案中 ifndef helloworld scene h define helloworld scene h include cocos2d.h include cocos ext.h using ns cc using ns cc ext class helloworld public ...

cocos2dx筆記 關於action

1.基本動作instantaction 放置 place 隱藏 hide 顯示 show 可見切換 togglevisibility 2.延時動作 移動到 ccmoveto 移動 ccmoveby 跳躍到 ccjumpto 跳躍 ccjumpby 貝塞爾 ccbezierby 放大到 ccscale...