动态加载资源 释放时要注意 引入引用计数统计

今天开发时,释放了预制体资源引起报错,这里直接使用了bundle.release

因为预制体的精灵图片是动态加载的,释放时将精灵图片一并释放了,引起错误

改为引用计数,解决问题

 

cocos资源释放文档:https://docs.cocos.com/creator/manual/zh/asset/release-manager.html

 

 

资源的动态引用

资源的动态引用
当开发者在编辑器中没有对资源做任何设置,而是通过代码动态加载资源并设置到场景的组件上,则资源的引用关系不会记录在序列化数据中,引擎无法统计到这部分的引用关系,这些引用关系就是动态引用。

如果开发者在项目中使用动态加载资源来进行动态引用,例如:

resources.load('images/background/spriteFrame', SpriteFrame, function (err, spriteFrame) {
    self.getComponent(Sprite).spriteFrame = spriteFrame;
});
此时会将 SpriteFrame 资源设置到 Sprite 组件上,引擎不会做特殊处理,SpriteFrame 的引用计数仍保持 0。如果动态加载出来的资源需要长期引用、持有,或者复用时,建议使用 addRef 接口手动增加引用计数。例如:

resources.load('images/background/spriteFrame', SpriteFrame, function (err, spriteFrame) {
    self.getComponent(Sprite).spriteFrame = spriteFrame;
    spriteFrame.addRef();
});
增加引用计数后,可以保证该资源不会被提前错误释放。而在不需要引用该资源以及相关组件,或者节点销毁时,请 务必记住 使用 decRef 移除引用计数,并将资源引用设为 null,例如:

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

 

posted @ 2023-11-08 17:11  赋流  阅读(28)  评论(0编辑  收藏  举报