条件比较复杂,过程大概是这个样子:
1,先预加载一个game.fire 场景。
2,等待加载完成。
3,加载一个复杂点的资源X,我这里是一个龙骨+相关图片的一个文件夹。
4,在加载这个资源成功后立刻 cc.director.loadScene(“game”) 切换场景。
5,这时候会提示场景加载错误
Failed to load scene: Error: [AssetLibrary] loading JSON or dependencies failed: Unknown error
分析原因
问题主要出在 var queue = LoadingItems.create 的回调上,因为资源X比较复杂,这个回调会调用两次,而且呢,回调又是通过 callInNextTick 调用的,有时间差,最后实际的执行过程是这样的
时间周期1
queue.create by resX
时间周期2
resX complete callInNextTick1
resX complete callInNextTick2 <- 重复执行了一次
时间周期3
callInNextTick1 执行
queue.destory <- 回收到了pool里面
通知 resX 加载完成
cc.director.loadScene(“game”)
queue.create by loadScene <- 这里又重新复用了刚刚被干掉的那个queue。
game complete callInNextTick3 <-因为之前预加载过game.fire。直接就complete了,但是回调要下一个周期才执行。
callInNextTick2 执行
queue.destory <- 刚刚复活的queue又被干掉了
时间周期4
callInNextTick3 执行
queue已经被干掉了,判断加载失败
暂时的解决方案
切换场景也延长一个周期。
setTimeout(()=>cc.director.loadScene(“game”));
但是在游戏运行过程中肯定还会有这样的问题。比如加载一组资源A,在他成功的那个时间周期恰好又开始加载其他资源B
。如果资源B之前加载过,就有可能被判定为加载失败。
不知道你们能看懂不,对着底层代码debug了一晚上。没精力再弄个复现用的工程了,过程说的比较详细了。希望你能够解决
龙骨资源文件
e1.zip (25.0 KB)
加载龙骨所在的文件夹这样的:
var promise = new Promise(function (resolve, reject) { cc.loader.loadResDir( _this.path , function (err, assets) { if( err ){ reject( " ____error" + _this.path ); }
resolve( ); });
});