升级Creator 1.6遇到的问题

升级后, 在模拟器中运行, 巨卡无比, 一个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引擎之前, 四个参数的使用, 倒和我的预期相同