作為一個(gè)cocos2d的小白爬虱,最近在集成cocos2d的過程中遇到了很多問題隶债,剛剛想要記錄的時(shí)候,總想著下一次吧跑筝,結(jié)果就是現(xiàn)在問題已經(jīng)忘記得差不多了死讹。
說說退出游戲后再次進(jìn)入時(shí)崩潰出現(xiàn)在replaceScene方法中,經(jīng)不斷排查曲梗,根源在于調(diào)用end()時(shí)赞警,并未清除資源文件,導(dǎo)致再次進(jìn)入時(shí)跳過了加載資源文件而導(dǎo)致崩潰虏两。
修復(fù)在CCDirector.cpp中愧旦,purgeDirector()方法中,增加
cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->purge();
cocos2d::extension::GUIReader::shareReader()->purge();
項(xiàng)目中可能用到很多緩存類:如CCSpriteFrame,CCAnimationCache,CCTextureCache等定罢,大多數(shù)情況下笤虫,最終占用資源的是CCTextureCache,場景中 所有用到的圖片最終都會(huì)生成在此緩存中祖凫。當(dāng)多種緩存類存在情況下琼蚯,刪除是有先后順序的,如果直接釋放CCTextureCache惠况,那么將會(huì)其他描述緩存找不到資源而引發(fā)程序的崩潰遭庶。在我的項(xiàng)目中用到了cocostudio做的動(dòng)畫,使用到了cocos2d-x引擎下的extensions下的控件售滤。所以我的釋放順序是:
1.GUIReader::shareReader()->purge();
控件描述文件json解析類罚拟,即GUIReader台诗,GUIReader對象創(chuàng)建時(shí),沒有引用計(jì)數(shù)的內(nèi)存管理模式赐俗,所以手動(dòng)調(diào)用purge(),銷毀對象
2.CCArmatureDataManager::sharedArmatureDataManager()->purge();
骨骼動(dòng)畫數(shù)據(jù)緩存清除拉队,追到purge()內(nèi)查看:
CCSpriteFrameCacheHelper::purge(); 對s_SpriteFrameCacheHelper對象的安全銷毀
CCDataReaderHelper::purge();對s_arrConfigFileList(實(shí)際上是vector)進(jìn)行clear 和 s_DataReaderHelper 銷毀
CC_SAFE_RELEASE_NULL(s_sharedArmatureDataManager); 自身對象數(shù)據(jù)銷毀
3.CCAnimationCache::sharedAnimationCache()->purgeSharedAnimationCache();
對動(dòng)畫緩存對象安全釋放,其中最主要釋放的是CCDictionary成員
4.CCSpriteFrameCache::sharedSpriteFrameCache()->purgeSharedSpriteFrameCache();釋放幀圖片緩存
5.CCTextureCache::sharedTextureCache()->purgeSharedTextureCache(); 最后釋放紋理
以上就是資源釋放順序,那么這段程序放在A->B場景切換的哪個(gè)函數(shù)中呢阻逮?我的選擇是在B的構(gòu)造函數(shù)粱快、init()其中的一處,當(dāng)然這段程序一定要放在其他資源創(chuàng)建之前(如按鈕的創(chuàng)建等)叔扼。如果A,B場景中有共用資源事哭,資源分的不是那么清怎么辦呢。瓜富。鳍咱。。也不怕与柑,在這段程序之后再次加載谤辜,由于加載資源是一個(gè)讀文件的過程,比較費(fèi)時(shí),可以選擇異步加載 或是 根據(jù)場景用到資源順序价捧,在每隔一段時(shí)間加載一部分資源丑念。
參考:http://blog.csdn.net/winthinking/article/details/50708114