ArmatureDataManager这个类的缓存释放不能通过简单的调用其destroyInstance函数,不然会造成内存泄漏的。!!!!
这个坑害我排查了整整一天,而且网上查了也没有找到类似的资料,所以我就在此分享给大家。
在用
cocostudio::ArmatureDataManager::getInstance()->addArmatureFileInfo(filepath);
这个接口加载骨骼动画的时候一定要用这个类提供的
cocostudio::ArmatureDataManager::getInstance()->removeArmatureFileInfo(filepath);
这个接口移除动画(而且2次的filepath要一致),而不能想其他缓存类那样直接destroyInstance(或者removeAllXXX、removeUnuseXXX)
ArmatureDataManager:addArmatureFileInfo在执行的时候会调用SpriteFrameCacheHelper的addSpriteFrameFromFile方法,而这个方法会吧用到的SpriteFrame引用计数+1。
然后这个引用计数只有通过调用ArmatureDataManager的removeArmatureFileInfo才会+1。
当直接执行ArmatureDataManager的destroyInstance的时候其内部会调用SpriteFrameCacheHelper::purge(),但是这个方法里面并没有对之前的缓存做引用计数-1。也就是必须手动按添加的名字一个一个释放,不能统一释放。
关于这一点注意事项,貌似也没有找到文档说要注意的,所一次就分享出来给大家。
当然如果是我理解错了的话,也请指出正确的释放方法。
ps:我用的是3.6的引擎,后面版本是不是已经不需要这么做了?

