一个资源释放的bug

平台:web
版本:2.1.3
描述:
报错需要三个条件:

  1. 我有两个场景A和B,都开启了《自动释放资源》
  2. 然后我在A场景时,预加载了B场景
  3. A和B里面有同时使用的资源
    那么此时,我从A跳转到B的时候,AB同时使用的资源就会找不到

请问这算不算个bug,或者大家有什么比较好的解决方案么

主要是引擎对引用的资源释放的太暴力了,不管别的地方有没有用到,直接释放,目前的方案就是:
自己写一套load和release机制(引用计数、记录引用关系等),论坛里有人发过,可以借鉴

关键的问题就是 它自动释放的时候,并没有去检测将要释放的资源 是否被其他资源引用,更要命的是 有可能 你再释放的时候,你的预加载还没完成,真是让人头皮发麻。所以我根本不敢使用预加载。完全不敢用。

有没有官方的同学
现在会在callbacks-invoker中报一个错误,原因是_callbackTable为空
感觉这实在像个bug

https://forum.cocos.com/t/cc-loader-getdependsrecursively/84888/11
在progressCallback里面给资源加引用那个方案不行么?

没有试过,估计会很卡,每加载一个item获取一次依赖,你可以试试。

你想的太多了。。。循环不了几次,我预估5次足够了,而且就是一个简单的查询,如果这样都卡的话,相信我,这个手机跑不了任何一个程序

应该算是引擎的一个bug,还有其他类似的资源释放的bug

兄弟, 你去看看 release_checker。想想为什么 引擎只在 debug的时候 会告诉你 你刚才释放了某资源,但是 该资源被XXX引用, 你仔细考虑一下 引擎为什么不在释放前去帮你排除依赖, 我猜测就是因为代价太大,所以引擎没有做。
你可以去看看源码。这是路径:CocosCreator_2.1.3\resources\engine\cocos2d\core\load-pipeline\released-asset-checker.js

我仔细分析了一下:
1、released-asset-checker仅仅是一个检测类的功能,而且这个功能在debug下运行就够了,真正发布了,还打印这些东西做这些检测没必要了,不是"代价太大"的原因,而且它的代价也不大。
2、资源引用、释放这块,和CPU代价什么的没关系,估计和引擎组人力代价有关系,他们偷懒了:sweat_smile:

所以 既然能检测出来依赖关系 为什么不在释放前做处理呢。

检测不出依赖关系,你仔细看看代码,它检测的就不是依赖关系

自己回答一下解决方案吧,

我在编辑器里面,通过Editor.assetdb把所有的public资源的uuid取了出来,存在了一个json中,
在进入一个新的场景时,遍历场景的dependAsset,把其中的public资源找出来,
然后通过setAutoRelease为false,让切换的时候不去释放,就可以避免这个问题了

不过,还不知道这么做会不会造成其他的问题,
等待时间的验证~~~~~~