关于资源释放的问题!

我通过一下方法加载一个合集
cc.loader.loadRes(“test assets/sheep”, cc.SpriteAtlas, function (err, atlas) {
var frame = atlas.getSpriteFrame(‘sheep_down_0’);
sprite.spriteFrame = frame;
});

当我不在需要此合集是通过官网例子
cc.loader.releaseRes(“test assets/sheep”);
来释放这个合集资源

发现并没有将与此合集的有关资源全部清楚掉!

load的map中还含有相关的SpriteFrame数据,这个写并没有清楚!
既然加载的时候将相关的SpriteFrame数据加载经来,为啥在释放的时候不能将这些相关的数据一起释放,这里的设计不科学,不合理啊!

@jare @nantas

刚刚遇到这个问题,测试了一下,以下是个人看法,不保证其正确性,仅供参考

有没有销毁通过cc.loader.getRes就可以测试,如果销毁了,返回null,如果没有销毁,返回相应的对象,所以你可以通过cc.loader.getRes来测试一个资源有没有销毁

你好现在释放确实是没办法实现递归释放,因为 atlas 及 spriteFrame 都是有可能会被单独引用的资源,所以引擎没办法肯定 atlas 引用到的 sprite frame 真的不再需要了。
@panda 怎么看?

这样解释,如果我释放了这个纹理集,肯定要释放这个纹理集的Texture2D这个资源,那你其他它有关于这个Texuture2D的SpriteFrame获取出来不是会报错!还是说,SpriteFrame发现没有了这个Texture2D这个资源,再去加载一次?

释放了正在使用的资源是会报错的

大神,为啥我这释放了正在使用的资源没有报错呢?

难道是self.node.getComponent(cc.Sprite).spriteFrame = spf;只是拷贝了一份?

如果是因为只是拷贝了一份才没有报错,什么情况下才会报错呢?

我重新看了下现有的实现,释放资源没有副作用,所以确实是不会报错。

大神,我的理解是这样的

self.node.getComponent(cc.Sprite).spriteFrame = spf

这句代码只是把资源拷贝了一份给spriteFrame,释放资源的时候是释放加载好的资源,但是拷贝的副本没有释放

不知道我这样理解是不是对的?

还是说self.node.getComponent(cc.Sprite).spriteFrame = spf这里已经引用了资源,只不过引擎通过其他办法让资源的释放没有影响到其他对象对资源的引用?

不对,这里没有拷贝操作

以前的版本中,资源如果有 destroy 操作,其它对象的引用就会失效。但是这个操作暂时去掉了,释放操作仅仅是释放了引擎的缓存而已,其它对象仍然能使用这个资源。

哦,好的,谢谢,我明白了:wink: