资源的动态引用与静态的分别

子资源的引用计数会自动加1 这个是引擎内部的机制 是吧?那么主动画释放后,所属的子资源计数 也会相应的减1,所以 如果子资源没有被其他方式引用 也就被自动释放了 ?

你好,有个疑问,动态更换SpriteFrame,如果多次load,那我每次load之前都得获取现有纹理decRef, 然后赋值新的再addRef,这样不是很繁琐吗

我觉得你的后端思维没有很敏捷,估计你是纯前端。虽然我很想给你讲明白,但是我懒得打字,总的来说你还不是很明白资源与资源之间的关系

一堆人对着"我看过文档"的人讲文档 :rofl: 还想叫醒装睡的人

1赞

这个貌似必须要这样做。旧的要decRef, 新的要addRef。

其实大多数情况下,你不需要 addRef 和 decRef,你动态加载的资源赋值给 node 的组件后,你不用 addRef,这个资源会随着 node 的销毁而被释放,具体释放可能不是立即的,但是不用你去关心.需要你addRef的情况是你知道这个资源不需要释放,因为还会被别的地方使用,文档上也写了,需要长期持有的时候才使用的,觉得繁琐的话你可以写个管理类,第一次加载资源的时候addRef一次,然后存到这个管理类上,别处使用的时候从管理类上取,然后真正需要释放的时候decRef一次,就不用关心到底哪个几次了,有没有成对调用了

1赞


如果不处理,移除这个节点时,并不会释放资源 ,则通过控制台输出一下


如果处理了,则输出如下
image

上面的代码仅做演示,不必深究合理性

@gandge @17633978421 @jare

增加引用计数后,可以保证该资源不会被提前错误释放。而在不需要引用该资源以及相关组件,或者节点销毁时,请 务必记住 使用 decRef 移除引用计数,并将资源引用设为 null ,例如:

this.spriteFrame.decRef();
this.spriteFrame = null;

我是说这一句。

我也没有深入去研究

应该是释放不是立即,具体的释放实机我也不清楚,
如果你想立即就要释放,你可以试试
cc.assetManager.release 系列接口(例如 releasereleaseAssetreleaseAll )会直接释放资源,而不会进行释放检查,只有其依赖资源会进行释放检查。所以当显式调用 release 系列接口时,可以确保资源本身一定会被释放。

这个释放时机我也是不清楚。我切换场景(设置了自动释放资源)也没有释放。