loadRes第二次比第一次能快多少?

已经加载过的资源再次加载能不能做到 更快?

web 上第二次加速明显。native 上具体情况不是太清楚~~~

图上打印的 就是native上的加载时间

可以请教一下是怎么打出来的吗?谢谢:watermelon:

cc.loader.loadRes_Ori = cc.loader.loadRes;
cc.loader.loadRes = function (url, type, completeCallback){
if (!completeCallback && type && !cc.isChildClassOf(type, cc.RawAsset)) {
completeCallback = type;
type = null;
}
var startTime = Date.now();
this.loadRes_Ori(url,type,function(err,prefab){
var finishTime = Date.now();
cc.log("LoadRes “+url+” Cost Time “+(finishTime-startTime)+” ms ");
completeCallback(err,prefab);
});
}

:watermelon::watermelon:非常感谢

还是说可能是 异步加载的原因,一连串连续的loadRes导致每个加载都是从磁盘一个个读,不了解其中的机制,希望帮反映一下,做一下优化

你好,第二次会直接读缓存。你这里第二次操作还是慢是正常的,因为 prefab 加载后还涉及到 prefab 的反序列化操作。 每次重新加载 prefab,都会有这一个步骤,请避免重复加载相同的 prefab。


更新,现在重复加载不会有损耗,除非缓存清空了

如果我自己把加载好的prefab保存起来 会不会有什么风险,比如说引擎自己会回收资源造成,我不知道 什么时候prefab中的东西被清除?

也就是用克隆好一点?

加载好的 prefab 保存起来,是很正常的操作,不会有风险。只有你自己释放引用才会被清除。

对,prefab 就是拿来克隆的

cc.instantiate 这个方法好像也蛮耗时的?之前碰到的问题:同时创建1000多个prefab的实例的时候 会卡蛮久,后来改成直接创建各种 _sgNode来拼,不用prefab那种方式 来做了

出于包体考虑,cc.instantiate 目前还没做优化,确实会卡蛮久的。


更新,已优化过

这个优化我觉得还是很重要的,编辑器的优势就是在于 把一些需要代码做的事情 全都可视化 的编辑,如果这样做之后 反而效率比较低的话,优势就被削弱了,而且大量调用cc.cc.instantiate的应用场景很多,比如说一个grid下要创建大量的子节点 ,每个子节点都是从prefab实例化而来

一般游戏里还是推荐使用对象池来重用这些对象。如果是类似 grid 下面的相同子节点,如果数量非常多,建议做成可循环复用的,否则创建再快也会占用内存。

这些是没错 。但还是希望能优化

好的,只要有时间有人力,都会做的。