【内存管理】cocoscreator资源卸载疑问

1、一个预制正在加载,同时卸载其他预制的引用资源,这种情况下,是无法知道正在加载的预制是否使用到将被卸载的资源的,就没有办法做卸载,请问该如何处理呢?
例如,prefab1引用sprite1、sprite2,prefab2引用sprite2、sprite3,卸载sprite2时,prefab1该如何处理

2、在资源加载前是否有方法能获取预制内的引用关系,getDependsRecursively接口,只在预制体加载完成后获取资源引用关系才是正确的

@jare 求解答。。

别指望了,感觉程序加载的资源管理这块是个弱项。

准备写一个基于引用计数的资源管理模块,遇到同样的问题。。。现在资源加载完成后才能获取到对应的依赖,这样子,如果还有资源在加载,你都不能卸载任何一个资源,因为根本不知道加载中的资源会不会引用到你释放的资源(因为接口获取不到加载中的资源的依赖资源)。。。开发团队没有注意到这个问题么。。。

求开发团队回应一下。。。@jare

我的方案是改成有任何一个资源正在加载,就不允许卸载

资源释放是伴随着节点销毁而释放的。如果没有节点销毁理论上士没有资源释放的。

例如,prefab1引用sprite1、sprite2,prefab2引用sprite2、sprite3,卸载sprite2时,prefab1该如何处理

这种情况:对资源进行 管理(引用计数和垃圾回收机制)。

可以参考一下:UILoader

使用

var deps = cc.loader.getDependsRecursively(prefab);

https://docs.cocos.com/creator/api/zh/classes/loader.html#getdependsrecursively

获取两个prefab的depend资源数组,通过比对diff和shared资源,将no share的资源release掉即可

那如果其中一个prefab处于加载中呢?释放a时,b正在加载,但不知道b具体引用到哪些内容

避免在加载中进行资源的释放,可以在加载结束后进行回掉释放

getdependsrecursively这种有很多限制。实际项目其实情况很复杂。

问个问题,destroy一个节点,这个节点下所有资源都会被释放吗

如果你说的所有资源是指节点和组件,那么是的。但如果你说的所有资源包含Assets,那么不是的。