1.4.x版本真机 cc.callFunc Action崩溃

游戏里有段Action逻辑特别复杂

大致是Sequence里用到Spawn,spawn又包含了一个Sequence,这个Sequence又有多个cc.callFunc,callfunc执行的方法调用了Function.bind来绑定当前的this

1.4.0,游戏运行后会经常遇到Sequence内部的cc.callFunc excute崩溃,不必现但概率非常高,xcode截图如下,已知安卓上也是这个问题。本来怀疑是Sequence(恰好creator更新日志有提到), 但升级到1.4.1也有这个问题

这是新鲜的崩溃截图。

大胆猜测是callfunc包含的函数对象经过js<->c++层来回切换,再经过难以捕捉的gc机制之后,内部对象数据已经混乱导致。

麻烦官方看看能不能修掉这个bug。另外,cocos的Action机制在js时代是不是该换一换了?

既然打了这么多字,再附送几条异常吧

:0:({0:“res/raw-assets/resources/10001/spine/pumpkin.png”}) is not a function

:0:[{_name:"", _objFlags:49153, node:null, _id:"", __scriptAsset:false, _enabled:true, label:null, bgColor:null, bg:null, __instanceId:4059, __eventTargets:null}] is not a function

:0:({name:“farm_element_0442”, bone:“root”, attachment:“farm_element_044”}) is not a function

XXX-mobile.app/script/jsb_boot.js:741:TypeError: ‘prototype’ property of fNOP is not an object

麻烦把你的使用代码发出来看下,的确有可能是 callFunc 使用的 callback 已经被释放导致的

我们在 1.5 中尝试使用纯 JS 的 action 系统,这样自由度会比较高,也不会出现类似这样的问题。

剩下几条的复现方法麻烦告知一下,前三条应该都是 loader 加载过程中产生的

这条是在 bind 的时候传入了非 function 对象,可能也会导致 callFunc 的问题

大概代码是这段,我尽量断行让可读性高一点,注释掉以后几乎没有崩溃。 我已经改成其他实现方式来规避这个问题

    var stopCoinChange = cc.callFunc(function(){
        this.jackPotsCoinNum.clear();   // 
        this.jackPotsCoin.active = false;
    }.bind(this));

    var changeIcon = cc.callFunc(function(){
        // 替换头像
        this.index = this.index % this.testIndex.length;
        this.icon.spriteFrame = cc.loader.getRes("textures/icon/icon_" + this.testIndex[this.index], cc.SpriteFrame);
        this.index++;
        this.init();
    }.bind(this));

    this.iconNode.runAction(
        cc.sequence( cc.fadeTo(1.2, 18),
                       stopCoinChange,
                         cc.delayTime(0.15),
                            cc.spawn( cc.fadeTo(1.2, 255),
                                             cc.sequence( cc.delayTime(0.07),
                                                                       changeIcon))));

CallFunc 是支持 target 的,理论上不需要 bind,你可以试试看去掉 bind,bind 会让函数变成 bind 内部的变量,无法被 C++ 直接持有,有可能导致问题

cc.callFunc(function () {...}, this)

我们也遇到,目前是绕过的,,

已经找到问题的原因,暂时先用 new cc.Sequence 替代 cc.sequence 即可

根本原因会在 1.5 中解决

1赞

哈哈,这个坑其实1.4beat版本我就踩过了,当时jare老师还专门给我说了一下cc.Sequenec和cc.sequence的区别
所有的action都有大小写开头的,所以使用的时候要格外注意

您好 cc.spawn 也要换 new cc.Spawn吗? 1.3.3版本的能用这个方法不?

对,用 new cc.Spawn

谢谢!

其他的动作函数呢?cc.scale,cc.fadeIn等这些呢,需要这样改么

还有repeatForever呢?还是只是sequence跟spawn需要这样改

只需要修改 cc.sequence, cc.spawn, cc.repeat, cc.repeatForever 这些可以包含其他动作的容器动作。FadeIn 这种直接数据动作是不需要修改的

cc.callFunc也要大写吗,还有cc.callFunc里面可以包含动作吗,我用的是1.4.2

1.5.2 好像还有这个问题
比如repeatForever里套一个Sequence,Sequence里套一个callFunc就会崩溃
而且只有callFunc里改子节点的active会崩溃

终于找到答案了,回去试试,谢谢大家,困扰我们好久了!