关于cc.loader.getDependsRecursively接口建议

看了文档,发现cc.loader.getDependsRecursively传参的资源必须是已经加载完成的才能获取到所有的依赖.
例如现在有A,B两个资源,A资源引用了B资源, 这时候先独立加载B资源并加载成功, 然后接着加载A资源,在A加载过程对B进行释放(因为在A加载成功前,无法通过cc.loader.getDependsRecursively获取到A的引用),当A加载完成后,就会发现B资源丢失了,从而引发渲染错误.

现在的解决方案有几点
1.在释放资源的时候采用延时释放(此方案并不严谨,时间点卡到刚好释放的时机还是会出问题)
2.在有加载资源的情况下,避免对资源进行释放.
3.cc.loader.getDependsRecursively如果能在加载前就可以获取到引用关系,这时候就可以对释放进行过滤.

大兄弟 ,预加载场景 你知道怎么取消吗? 这货开始了 就停不下来。 我之前也想着 提前预加载有可能会进的场景,但是会存在预加载完了,玩家并没有进入该场景,而是进了其它。然后从其它出来,释放资源就有可能会把预加载中依赖到的资源给释放了。我觉得 引擎底层应该能知道 预加载的场景所依赖了哪些资源吧?为什么 释放场景资源的时候不做一下过滤呢。想不明白。 我在QQ上也私聊了panda,不过他应该很忙,并没有回答我的问题,以至于 我现在根本没法提前预加载场景。而是在loading页面才做加载,那这个预加载的效率就没有最大化。

加载完场景要对场景里的引用资源进行引用计数,你可以试试
let scene: cc.Scene = cc.director.getScene();
let sceneDependAssets:string[] = (scene as any).dependAssets;

这样确实可以拿到依赖,那么你要释放的时候呢?你怎么知道你即将释放的资源没有被其它依赖?。 我之前试过去遍历cc.loader._cache 里面看看到底有没有被缓存中的资源依赖,但是这个遍历效率太低了,放弃了。楼主有什么好办法?

楼主不是说了用 引用计数 么

那是加载场景后,预加载呢? 我预加载 不进这个场景呢?

抱歉没用过预加载的方式,看了文档preloadScene的onLoaded方法有一个asset参数cc.SceneAsset,应该可以通过该资源传参给cc.loader.getDependsRecursively获得你预加载的场景引用资源吧!

那也是加载完了之后才有的。 所以 你预加载 不阻塞的话 就有可能会被其它释放掉的可能。

那么预加载就很危险了,如果阻塞的话 那么预加载意义何在呢

:joy:所以你这个问题应该跟我是一样的,在加载过程中,资源所引用的资源有可能会被释放掉,我现在就是判定在加载过程中先不进行资源释放,能加载完成了再检测释放.避免误释放

好像是这么回事,我现在尝试在progressCallback中能不能及时把引用加上,不过还没有成功

:grin:尝试出来记得分享一下呀

昨天研究了下,成功了
在progressCallback里面给每个item的id引用+1,并且递归item.dependKeys(item.dependKeys自己要存一下),把所有遍历到的id全都引用+1,就成了

效率感人?