我在单步的时候也很懵,就好像直接跳过0,从1开始的一样,然后所有的加载完了,又回到0了
i = 1 或者i = 2这样开始呢,是不是最后也是1或者2
感觉是你编程的逻辑没搞懂异步和同步的问题,不是 cc api 的原因
嗯,之前的加载思路确实有问题,但是在这里用异步去解释现象有点牵强。
截图中可以看到,i的初始值无论是多少,却是最后一个被加载出来,单单用异步的话,那加载初始值也不应该是最后一个吧?不是很理解这里,还请赐教
用异步根本解释不通,这个问题要追的话,只能断点一步步进去调试,我周末晚上调了一下,没弄明白。楼上没一个明白的,可惜这帖子就这么水了
单步的情况貌似初始值也是被加载成功的,但是就是在最后被添加
是的,跟异步没啥关系
其实前面有人已经说了…
1.loadRes是异步,但不是整个函数都是异步,没有缓存的时候是异步,你加载过一次没有释放就是同步,具体可以去看代码
所以楼上这样写,i==0时跑的是真正异步load函数,之后是直接uuid返回的
2.cc.instantiate 应该已经做优化了,2.0.10版本不会影响到上述问题
我也来凑个热闹
。
稍微变动一下测试代码:
start() {
let startTime = new Date().getTime();
for (let i = 0; i < 10; i++) {
cc.loader.loadRes("prefab/pic", function (err, prefab) {
let endTime = new Date().getTime();
console.log("i:",i,",cost:",endTime - startTime);
});
}
setTimeout(() => {
console.log("-------------2s后再进行读取操作----------------");
startTime = new Date().getTime();
for (let i = 0; i < 10; i++) {
cc.loader.loadRes("prefab/pic", function (err, prefab) {
let endTime = new Date().getTime();
console.log("i:",i,",cost:",endTime - startTime);
});
}
}, 2000)
}
测试结果:
从两组操作各自花费的时间来看,明显第一组花费的时间要高于第二组操作所花费的时间。(假设忽略打印日志时间带来的误差)
猜测:第一组的读取操作中,每一次的循环都做了将预制件资源加载到内存的操作,而第二组的读取操作中,是直接从内存里拿出来的,所以要快的多;而至于第一组操作中为什么会出现用时最多的是最先进行操作的: i = 0,cost = 54 ,可能与cocos 引擎的实现机制有关,看图:
这是读资源时需要用到的一段代码,来源于engine\cocos2d\cor\load-pipeline\loading-items.js。猜测,首次创建queue时耗时比较多,所以出现这种情况。
看不懂引擎代码,就姑且胡乱猜测一下。
嗯,看了你的回答,我有这样的想法:(条件1)程序在执行for的时候,i=0–9,的过程耗时很短,可以视为是同
时;之后是加载过程:因为i=0是第一次加载,所以耗时最长,因为有条件1,所以在输出上i=0是最后一个被输出;应该说是按照时长依次输出,因此i=0最后一个输出;
对于第二张截图:因为内存中有预制资源,所以按照for循环的顺序依次取出,所以时间是累计的(?)
测试了一下,发现加载预制资源打印顺序1-90,而加载图片资源的打印顺序是正常的0-9,估计prefab的加载引擎有什么特殊处理,但是看源码没找到,期待大神解答。




