升级后, 在模拟器中运行, 巨卡无比, 一个sprite的移动, 几乎要花十几分钟才能到目的, 本以为是免编译闹的。 在将其打包移到android真机上后, 发现问题依然在, 只是这个缓慢移动变成了,开始极慢的动作,然后突然瞬移到目的。 在过程中, 各种动画的播放依然不正常。
感觉这个版本连beta版都算不上, 就正式发布了。 还是说是我打开的姿势不动。
ps: 项目在1.5.2的版本上正常表现
1.6 已经测试了整整一个月了,好像没人反馈过这样的问题。你能上传一个 demo 吗?
我试试能不能剥离吧, 项目有点大, 不太好拆
通过终极debug大法, 定位到了是哪段代码出了问题, 但是具体什么原因,依然看不出。 麻烦给看一下。
发生的场景是在scene onLoad的的时候, 动态加载prefab,并预先分配部分实例造成的, 具体是
var PrefabPool = cc.Class({
name: 'PrefabPool',
extends: cc.Object,
properties: {
_pool: {
default: null,
type: cc.NodePool,
},
_resUrl: null,
_baseNode: null,
},
ctor: function (resUrl) {
cc.log("prefab pool ctor:" + resUrl);
this._pool = new cc.NodePool();
this._resUrl = resUrl;
},
init: function (cb) {
var self = this;
try {
cc.loader.loadRes(self._resUrl, function (err, prefab) {
if (err) {
cc.error("load res error:" + err);
return;
}
self._baseNode = prefab;
var pf = cc.instantiate(prefab);
self._pool.put(pf);
if (cb) {
cb();
}
});
} catch (e) {
cc.error("load res error:" + e);
}
},
asyncPreload: function (copies) {
cc.director.getScheduler().schedule(this.preload.bind(this, copies), this, 0, 0);
},
preload: function (copies) {
for (var i = 0; i < copies; ++i) {
var node = cc.instantiate(this._baseNode);
this._pool.put(node);
}
},
put: function (node) {
this._pool.put(node);
},
get: function () {
var node = this._pool.get();
if (node === null) {
node = cc.instantiate(this._baseNode);
}
return node;
},
});
module.exports = PrefabPool;
上面是一个PrefabPool的类,
在onLoad部分,
var treeNodePool = new PrefabPool(‘prefabs/TSSkillTreeNode’);
treeNodePool.init(
treeNodePool.asyncPreload.bind(treeNodePool, 20)
);
这里也仅是使用asyncPreload会出这个问题, 如果是下面这样调用, 也是正常的。
treeNodePool.init(
treeNodePool.preload.bind(treeNodePool, 20)
);
你只传了 4 个参数,那么这个回调将会 repeat forever,想要只执行一次,你需要传入 6 个参数……
所以最终结果就是,每一帧都会生成 20 个节点,放到对象池中……
参考 Scheduler 的 API 文档
http://cocos.com/docs/creator/api/classes/Scheduler.html#method_schedule
四个参数的情况下,repeat 是缺省值 repeat forever
schedule ( callback target interval [repeat =cc.macro.REPEAT_FOREVER] [delay =0] paused )
定时器
来自官方文档, 第四个参数是repeat, 我指定了0, 应该是只执行一次, 难道1.6引擎在默认语义上和之前的引擎不同?
四个参数的时候,最后一个是 paused,repeat 是可选的
… 为啥1.6之前的引擎表现完全不同? schedule参数列表中的中间部分参数可缺少, 这种语义太奇葩了吧
为了避免出问题, 我还是将所有参数全补全吧,
这个嘛,历史问题,因为是从 C++ 的重载函数 API port 过来的,JS 弱类型,又没有函数重载,所以才变成这么奇葩。。。
en, 奇怪的是在1.6引擎之前, 四个参数的使用, 倒和我的预期相同