Armature对象播放完动画,用什么方式remove掉?

这个问题在综合讨论区提过一次,但是多名开发者表示没有合适的解决方案。由于这个问题和Cocos Studio联系比较紧密,在这里提一遍,希望能得到关注。

本人用的是cocos2d-x 3.0版本。在Armature对象播放完动画时,有时候会有残影留下(反复播放动画的话残影会很明显)。

一方面为了消除残影,另一方面为了释放资源,在动画播放完时应当remove掉Armature对象。我的思路是当动画播放完成,回调MovementEventCallback,这个时候调用Armature对象的removeFromParent,但是会发生崩溃,崩在了Armature的update方法里面。

我想可能是Armature的生命周期我没有搞清楚,可是我查了一些资料也没找到其他的解决方案。不知道哪位大神有高见。代码如下:

  void playAnimation(Node* node) 
        {
            float speed = 2.0f;
            Armature *armature = Armature::create("anim");
            armature->getAnimation()->setSpeedScale(speed);
            armature->getAnimation()->playWithIndex(0, -1, 0);
            node->addChild(armature);
            armature->setPosition(Point(0, 0));
            std::function<void(Armature*, MovementEventType, const std::string&)> armatureFun = =](Armature* armature, MovementEventType type, const std::string& id)
            {
                if (type == MovementEventType::COMPLETE)
                {
                    armature->getAnimation()->stop();  //这句有没有都会崩
                    armature->removeFromParent();     //调用这句导致崩溃
                }
            };
            armature->getAnimation()->setMovementEventCallFunc(armatureFun);
        }

你好,你说的残影是什么情况啊?

我说的残影貌似是动画的最后一帧,有的动画播放完会留下,但是也不是必现的。现在用网友提供的方法,延迟remove,以上的问题已经解决了。可是还是不清楚为什么会出现这样的情况。

最后一帧你在编辑器编辑的有显示内容么?建议将最后一帧拷贝一份,放在紧挨着的地方。

remove会将armature移除,但是纹理是不会跟随remove移除的。

哦,晚上回去看看,公司没法查看。“建议将最后一帧拷贝一份,放在紧挨着的地方。”是什么意思呀?最后一针做成空白的?
奇怪的是做了延迟remove之后,残影再也不出现了。。

残影时有时无,内存完全不会释放,坑爹啊

看了下,残留的并不是最后一帧,是中间帧,而且并不是固定的某一帧。。。remove armature对象之后,这样的情况就不存在了

怎么延迟删除啊

之前用2.2 没有这个问题,换成2.2.5后也遇到了这个问题

我这边用一个idle动画的方法可以暂时解决。

但是cocostudio引擎的开发人员不能总把问题丢给上层使用者啊。

看了下,项目中如果用idle动画的来解决的话,要美术做很多idle出来

官方能提供个解决方案吗??