小游戏平台使用bundle加载远端资源同时立即释放bundle包会导致报错, 如下图
// 复现bug代码,复制到小游戏控制台运行
cc.assetManager.loadBundle("Mode180",(err,bundle)=>{
// 立即加载远程端 prefab
bundle.load("Mode180",cc.Prefab,(err,k)=>{console.log('load:',err,k)});
// 立即释放bundle 或者没等load Mode180 完成就释放就会触发报错
bundle.releaseAll();
cc.assetManager.removeBundle(bundle);
})
这bug会导致内部路径前缀为 undefined

bug 特性
- 隐蔽性: 这bug触发概率比较低, 网速快时候测不出来, 触发错误不会被小游戏平台异常捕获
- 堵塞加载流程,影响加载速度甚至卡死
- 恶心网速慢的玩家
- 潜在内存泄漏
- 我是怎么发现这个bug的: 在游戏途中加载背景音乐还没完成时, 玩家退出关卡释放音乐所在bundle触发
如果网络重试次数设置100, 那么这bug会占用大量加载时间最终返回错误, 或者之间卡死流程
bug机制:
bundle.load() 是 异步 的,但你在回调里 同步 执行了 releaseAll() + removeBundle() ,把 bundle 从注册表注销了;等 prefab 的 JSON 下载完成、要拉它的依赖图片/音频(native)时,引擎重新查 cc.assetManager.bundles 查不到这个 bundle → 拿不到 config → 兜底用 cc.assetManager.generalNativeBase (main.js 没传 = undefined)→ 拼出 undefined/xx/xxx.png 这样的 URL → 适配器当本地路径找不到文件 → 报 “file undefined/… does not exist!”(6029)。
undefined来源:
当远端资源下载好后才跑combine函数,这函数作用是组合url路径, 因为bundle释放了所以 config 是空的,所以 base == undefined ,导致拼接前缀是undefined



