使用了Cocostudio的场景切换时如何释放所有内存

由于项目中用到的图片比较多,加载纹理比较耗时就会出现卡顿的情况,一次性加载所有资源内存又不够用,于是我们将项目划分了几个场景,每个场景一次性加载自己的所有资源,集中了比较耗时的操作,当然我们在场景切换间加了个过渡场景,执行上一个场景所有资源的释放和下一个场景所有资源的一次性异步加载,可是实际上每次都不能完全释放上一个场景的所有资源,这样就会导致项目占用内存越来越大,我这毎切换一次场景基本上增加15M内存,也没有检测出存在内存泄露的代码:12: 求高人指点。
其中释放上一个场景所有资源用的是以下代码:(Cocos Studio 1.6,Cocos2d-x 3.4)

    // 释放场景对象自己
    scene->removeFromParentAndCleanup(true);
    
    // 清理GUI管理类(这个不要放到最后清理)
    GUIReader::getInstance()->destroyInstance();
    
    // 清理场景管理(所有读取的场景都会被清理掉)
    SceneReader::getInstance()->destroyInstance();
    
    // 清理动作(这里指Action动作,不是动作编辑器的动作。)
    Director::getInstance()->getActionManager()->removeAllActions();
    
    // 清除动画数据
    ArmatureDataManager::getInstance()->destroyInstance();
    
    // 清理数据管理
    DictionaryHelper::getInstance()->destroyInstance();
    
    // 清理精灵帧
    SpriteFrameCache::getInstance()->destroyInstance();
    
    // 清理纹理
    Director::getInstance()->getTextureCache()->removeAllTextures();


```



请问还有什么没有释放干净?为什么每次会多出15M内存?该怎么查找如何释放,非常感谢!

过度场景是Transition吗?如果是这个的话,在切换的时候使用的内存会瞬间变大。当然,切换完又会正常。你其实可以在切换场景时调用
AnimationCache::destroyInstance();
SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
TextureCache::getInstance()->removeUnuserdTextures();
这三个手动清除缓存= =!但是你下次要再用的话…还得加载

过渡场景是一个自己添加的Loading Scene,和一般场景没啥区别,只是就显示了个转圈的加载中图片,播放了个RotateBy动画,实现了上面我所说的功能。
瞬间变大也没关系,关键是不能让它每次切换场景都增加内存。
使用了你的前两行代码测试了下还是一样的,第三行在3.4中已经不是那么写了,我上面的代码有。
要的效果就是手动清除了下次再用重新加载。是不是还有什么没有释放干净:6: :6:

:2::2::2:不知道啊不知道!!:6::6::6:

能提供个Demo吗?我试试i

你把QQ私信给我吧

看来问谁都靠不住啊,最后还得靠自己,耽误了几天时间想尽各种办法仔细进行测试最终定位了问题所在:2:
原来是CCMenuItemImage::create方法的老版本兼容性问题,引擎在内存释放上没有处理好,改成新的写法就一切正常了
比如:
CCMenuItemImage::create(“single_choice_normal.png”, “single_choice_select.png”, this, menu_selector(InformationLayer::choiceMaleCallBack));
改为:
MenuItemImage::create(“single_choice_normal.png”, “single_choice_select.png”, CC_CALLBACK_1(InformationLayer::choiceMaleCallBack, this));

看来新版本引擎中弃用的方法尽量还是都纠正过来比较安全,磨刀不误砍柴工嘛!

感谢分享~:14:

能加下你的qq嘛

楼主我想问你切合场景释放资源用这么麻烦吗?我都是直接Director::sharedDirector()->replaceScene(scene);
这样不行吗?

顺便问你下你的内存监视软件是什么软件?

可以1481555638

第一句就说了啦,我们图片多,要直接这么加载慢死

Xcode自带的,看来你不是在Mac环境下开发的

为什么使用CCMenuItemImage旧方法创建会导致内存删不干净?好奇怪啊

使用的引擎从2.2.3升级过来的,我也想知道

求是怎么写的。我用你写的这些清除后还是不减内存啊。。。。他的图片纹理的引用计数一直不减少,所以removeTexture时候没有用啊?

MenuItemImage 这玩意很少用吧………………

我的也是直接这样,不过程序经常奔溃

:2: :2: :2: :2: :2: :2: