cocos2d-x js 3.12 循环多次使用cc.callFunc,手机越来越卡

for (var i = 0; i < 150; i++) {
    var sp = new cc.Sprite("test.png")
    var orginPos = {x:0, y:0};
    var desPos = {x:0, y:1000};
    sp.setPosition(orginPos);
    parent.addChild(sp);
    sp.runAction(cc.sequence(
        cc.moveTo(0.4, desPos.x, desPos.y),
        cc.delayTime(0.8),
        cc.callFunc( function(node) {
            node:removeFromParent(true);
        })
        //cc.removeSelf()
    ));
}

每5秒运行一次如上代码,刚开始非常流畅,随着执行次数越来多,动画越来越卡,如果把 cc.callFunc 去掉,用 cc.removeSelf() 代替,则无论运行多久,都没出现卡顿现象。但游戏中不可能不用callFunc,求大神帮忙
cocos2d-x js 3.12 Native,测试手机 iphone 5,iphone 6s,安卓上也一样有该问题。
@minggo @panda

会不会是匿名函数的原因

可能是。现在解决办法是创建一个单独的callFunc,然后所有的都使用这个回调函数,但这个隐患还是存在

lambda是自动释放啊,你每次都创建了一个sprite是不对的,你的回调里把sprite移除了吗?而且频繁创建sprite这种设计思想是不合适的,你要用一个“对象池”来保存创建过的对象,移除一个对象,把它放到“池”里,下次创建sprite,直接从池子里取出,而不是new一个新的。(你代码排排版,论坛是支持markdown代码的)

1赞

释放了,实际项目中是使用的对象缓存池,也一样有该问题。上述代码是为了更清楚地反应真实问题

贴代码记得要用markdown,否则看起来眼睛疼。。。

啧啧 一直new 不卡才怪

sequence函数会将动作存放进他自己的数组中,所以你这里的三个动作都用存在内存消耗(相对于移动、延时、匿名回调的消耗更大),现在来看你的整个过程,每5s添加150个sequence函数(包括3个动作)进内存,而这些动作释放完需要180s,然后你是无限循环的。。。。,导致内存中的sequence函数越来越多;把匿名函数改成命名函数,因为每一次都是使用相同的函数,这种情况会有所好转,但我觉得时间长了,还是会出问题的
以上是个人理解,有错误,麻烦指正!

关键点不在new sprite上,项目中是用的缓存池的

实际上也是如你所述,目前只能避免这么用