关于ArmatureDataManager,骨骼动画内存释放的坑

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的引擎,后面版本是不是已经不需要这么做了?

mark。。。。。。。。。。检查下

感谢分享!!!

新手问一下ArmatureDataManager是怎么判断这个动画完成的,完成后再删除

getAnimation()->setMovementEventCallFunc()
判断事件是否是完成状态的

查到了,谢谢你。我还想问一下: 我们不是一个游戏工程,需要在特定的情况下调出骨骼动画,退出界面的时候,我都要把什么清理掉啊

非游戏工程?那我就不知道了,这个最好还好看看cocos的官方有没有什么说明的东西吧

好吧,谢谢。 我感觉官方给的资料都好少:6:

MARK!:2:

这问题貌似在最新的3.17.1还是存在的吧,即使是用removeArmatureFileInfo也不能释放图片骨骼所用图片内存,引用计数并没有减少,用cc.Director:getInstance():getTextureCache():getCachedTextureInfo()打印即可看到图片并没有被释放