请问cocos creator 会释放prefab引用的图片吗?

现在有个问题是我们的一个prefab上面挂了 sp.Skeleton组件,通过getDependsRecursively 没有找到SprieFrame,但是能找到Texture2D,如果释放了Texture2D,下次再载入这个prefab就不对了。
我想知道spine组件里面,引用Texture2D的是什么呢?是否也可以用getDependsRecursively获取?

谢谢~

是 SpineAtlas 对象,也可以用同样方法获取到的

那 TiledMap 呢?

都一样的

也碰到了这个问题,但是随Prefab加载的静态资源怎么管理呢?

1赞

只要是通过 cc.load 动态加载的资源,不管是Prefab还是Spine,都可以这样释放:

let deps = cc.loader.getDependsRecursively(obj);
if (deps) {
cc.loader.release(deps);
}

假设这个obj是Prefab,则deps会返回一堆资源,该Prefab中静态引用的所有资源都可以被释放,包括Spine对象,同时释放内存,亲测有效。

我现在碰到的问题是,假设Prefab静态引用了 a 图片,在我释放了Prefab后,如果再次打开该Prefab,使用了a图片的Sprite就会变成黑块,似乎引擎并不知道a图片被释放了。郁闷的是,a图片是静态引用的,也就是说,它是放在 res 目录下,我不能通过代码对它做动态管理。

1赞

如果你只有一个prefab引用了这个图片,而且你上面说的所有的deps都能被释放,那应该就没有问题。
无论是cc.loader.releaseRes 还是 cc.loader.releaseAsset, 内部调用的都是 cc.loader.release

我现在已经基本解决了,当然还需要进一步测试

我是选择性的对 perfab依赖的 SpriteFrame, sp.SkeletonData和cc.TileMapAsset进行释放。
对他们进行引用计数管理,如果引用为0则释放,释放的时候减去他们所引用的图片的引用,如果图片引用为0则释放图片

我这边也是这样用,大致的思路是一样的。
基本的思路非常简单,
1 首先我们获取一个资源的所有依赖资源(包括自身),当然前提是这个资源包括他的依赖资源已经成功加载了。
2.将这个依赖资源做一次筛选,去掉那些正在被引用的资源,(当然也就包括当前资源的依赖资源),然后返回一下新的列表; 还有就是如果这个资源正在被加载,那么也要作为不能释放的资源。
3.将2得到的新的列表,进行释放。

对,就是这个意思,我是用引用计数做的,引用为0释放SpriteFrame这些,图片引用为0则释放图片

嗯嗯,我也是引用计数来做,再js引擎里加一个引用计数,维护这个东西。

那个,各位大哥,我也遇到了这个问题,你们有解决吗。

是用什么方式计算引用数量的?

也是遇到同样问题。

如果场景勾选了自动释放,那么切换场景之后,会得到以上说的内存释放吗?(明白了,看了文档 , 不会。)

自动释放,不会释放通过cc.loader载入的资源

MARK,同遇到类似问题

您好,我通过cc.load动态加载 prefab , prefab 子节点有 Spine 。通过getDependsRecursively 释放 prefab ,内存下降,但再次打开prefab、 Spine 会花屏 ,黑块。请问您是怎么解决的 ?

mark

https://docs.cocos.com/creator/manual/zh/scripting/load-assets.html?h=releaseres#资源的依赖和释放这里有计数的

哥们,我看你发的链接里也没啥呀,不会是自己引用自己计数吧???有官方的接口吗?