3.6.3资源引用计数的BUG

这实现就有问题,其它地方有引用,引用计数不应该为0,怎么就给释放了呢

先别急着下结论是bug,查一下bundlea和b有没有依赖关系,移除其中一个bundle的时候是否有释放该bundle加载过的资源,或者搞个Demo发上来看看大家一起研究研究如果确实有bug,也能让大家少踩坑

bundle-release-bug.zip (36.6 KB)
demo来了,主要问题在bundle.removeAll会不管引用计数,把当前bundle和引用到的其它bundle的资源全部删除
3.6.3和3.7.1我都试了,都这样

需要构建web平台后测试

3.7.1试了第一次点击释放没有崩啊

需要构建后

哦构建web包还是原生

web就行

借地方再说一下这个问题,父节点执行onDestroy时,子节点已经早早被销毁了

:zipper_mouth_face:来个引擎的大哥吧


直接使用releaseAll除非你确定bundle中使用的资源或者依赖的资源其他地方没有引用,还是通过addref和deRef来管理资源吧,我一直这么用没有出现问题,如果实在要用bundle中的方法直接释放的话用bundle.release()来释放某个资源,releaseAll除非你很清楚资源依赖关系不然风险很大

我这里一个Bundle存一个UI,里面内容比较多,所以用的是releaseAll,我开始期望的是它一定会将自身的资源全移除,而引用的资源减少引用计数(毕竟不归你管理),现在看来它的实现是不管你是谁遍历到了直接删

ui是一个prefab吗?那你直接bundle.release(prefab)不是就妥了吗?不过这还是很不方便我是每次加载创建资源的时候都会添加一个资源管理组件资源的管理伴随节点生命周期,节点destroy资源也就释放了不需要额外的去管理

:ok_hand:,我正在修改,我这里也是做的自动释放,之前对这个releaseAll理解的有问题(我还是感觉照我原来理解的那样设计这个api合理 :zipper_mouth_face:)

先prefab.decRef,在资源bundle.releaseAll
哇,这也能炸么,我就想把它完全移除就好难啊 :face_with_raised_eyebrow:好难用啊

prefab.decRef不就已经释放了吗?为什么还有releaseAll来这么一下, decRef会调用relealse的方法,加载prefab.addref destroy的时候decref,add和dec成对出现就好了呀,当然如果你还有其他需要动态加载的资源比如动态加载一张纹理 音频什么的也需要自己管理

prefab和资源在两个bundle,prefab和资源的分包策略会不一样,然后资源的分包计划是不用去处理资源引用计数的事,卸载UI的时候直接全释放

没有关系的prefab对资源是静态引用加载的时候引擎已经做好了其依赖资源的引用计数了,你管理好动态加载的prefab就ok了,它依赖的资源要不要释放不需要你关心的否则这个引用计数就没有意义了,回到2.4版本以前了

资源那个分包会有静态和动态混用的情况 :zipper_mouth_face:

所以我上面说了你在脚本中动态加载一些spritefame,audio等资源这些要么你提前管理好,要么你和加载prefab一样成对的出现addref和decRef

我改成了这样

资源加载和释放addRef和DecRef成对出现就好了:joy:怎么越弄越不对劲了,算了能跑就行了管他呢,:grinning: