使用cocos2d-x集成的游戏,退出后,再次进入时崩溃问题解决

作为一个cocos2d的小白,最近在集成cocos2d的过程中遇到了很多问题,刚刚想要记录的时候,总想着下一次吧,结果就是现在问题已经忘记得差不多了。

说说退出游戏后再次进入时崩溃出现在replaceScene方法中,经不断排查,根源在于调用end()时,并未清除资源文件,导致再次进入时跳过了加载资源文件而导致崩溃。
修复在CCDirector.cpp中,purgeDirector()方法中,增加

 cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->purge();
    cocos2d::extension::GUIReader::shareReader()->purge();

项目中可能用到很多缓存类:如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场景中有共用资源,资源分的不是那么清怎么办呢。。。。也不怕,在这段程序之后再次加载,由于加载资源是一个读文件的过程,比较费时,可以选择异步加载 或是 根据场景用到资源顺序,在每隔一段时间加载一部分资源。

参考:http://blog.csdn.net/winthinking/article/details/50708114

你可能感兴趣的:(使用cocos2d-x集成的游戏,退出后,再次进入时崩溃问题解决)