bundle.release 疑问 v2.4.3

  • Creator 版本: 2.4.3
  • 目标平台: iOS / Android

前言:
主要是在原生平台上的开发,记忆体控管很重要,我目前的想法是
prefab 开启时载入所需要的图档,在prefab 关闭时,释放图档,维持记忆体最小化

程式逻辑如下:
资料夹为 Res 设为Bundle
Res/UISprite
Res/BTNSprite

在我开启prefab 的时候
func loadAtlas {
cc.assetManager.loadBundle(‘Res’, (err, bundle)=>{
bundle.loadDir(‘UISprite’, (err , assets)=> {
if (err) {
return;
}
// assets 存图档
this.spriteList = assets;
});
});
}

当我移除 prefab 的时候
func releaseAtlas {
let bundle = cc.assetManager.getBundle(‘Res’);
this.spriteList.forEach(keys =>{
bundle.release(‘UISprite/’+keys, cc.SpriteFrame);
});
}
bundle.release 官网的范例是用路径来移除

想请问各位,在第二次开启prefab 时 启动loadAtlas(),感觉是没问题的 返回的assets 是有值的
但在塞入prefab 时就报错,资讯如下

ERROR: Uncaught TypeError: Cannot read property ‘load’ of null, location: src/cocos2d-jsb.js:0:0
STACK:
[0]208.proto.hasEventListener@src/cocos2d-jsb.js:34119
[1]142.proto.on@src/cocos2d-jsb.js:25584
[2]142.proto.once@src/cocos2d-jsb.js:25611
[3]_applySpriteFrame@src/cocos2d-jsb.js:22758
[4]set@src/cocos2d-jsb.js:22605

web 版不会有问题,但原生上会报错
而且只释放 Res/UISprite 底下的图,但是连Res/BTNSprite 底下的图也不见
感觉被 releaseAll 了
想请问有经验的大大,以及引擎组,能不能协助一下我的疑问,感谢

this.spriteList.forEach(keys =>{
bundle.release(‘UISprite/’+keys, cc.SpriteFrame);
});

这里用 key 来拼接路径?路径拼接的是对的么?

spriteList是图档的列表keys是图档名称,路径是对的
spriteList = {
login_title : cc.SpriteFrame,
… }
并且第二次loadBundle’Res’返回的资产也是有东西的
但在塞图的时候才会报错
ERROR: Uncaught TypeError: Cannot read property ‘load’ of null, location: src/cocos2d-jsb.js:0:0
塞图程式码如下
this.titleSprite.spriteFrame = this.spriteList [‘login_title’];

这蛮奇怪的,因为this.spriteList [‘login_title’]; 有东西的,在webview上是没问题的,在native上会报错
反覆检查我的程式逻辑应该是没错误的

报这个错的时候 资源引用计数已经有问题了,它已经被释放了。是否其他地方你对资源引用计数有操作呢?

在第二次开启prefab 时 启动loadAtlas(),感觉是没问题的 返回的assets 是有值的

使用cc.isValid判断下 这时候资源应该已经无效了