creator 1.10.2 动态加载龙骨后, 模拟器,ios,android真机crush

Hi, 各位大佬。我使用的是creator 1.10.2。工程中使用代码动态加载龙骨资源可以正常显示。当销毁节点后,chrome浏览器没有问题,但是在模拟器,ios真机,android真机上必然会出现crush。我动态加载龙骨的核心代码是:

crush堆栈信息是:

我已经按照论坛里面已有的帖子的方法来修改:动态切换龙骨,也反反复复尝试了多种帖子的方法,仍然没法解决。附件是最小化后的测试工程test.zip (954.9 KB),可以必然重现该问题。迫切需要大佬们的帮助,万分感谢了!

@jare @dumganhar

我也有这个问题 请解决后能分享一下 感谢

 /* 
            1.9.3版本可用,1.10.2应该也可以,虽然没试过。
            这是我自己的代码,里面获取名称什么的根据实际应用自己改。
*/
_playBone:function(name){
        let self = this;
       //  根据自己项目实现 获取下两个骨骼文件的路径
        let monster_db_name = this._monstersBasic[name].manual_db_name;
        let dbUrl_ske = 'armature/monsters/manual/' + monster_db_name + '_ske';
        let dbUrl_tex = 'armature/monsters/manual/' + monster_db_name + '_tex';
        
        let node = self.widget.getChildByName('monsterDB');
        this.armatureDisplay = node.getComponent(dragonBones.ArmatureDisplay);
       /* 
           俺遇到的情况是1.9.3版本原本没有以下这些代码,顺利运行,后来手贱升级到2.0(发现native上性能呵呵了),又降回1.9.3后又出现坑,又不行了。
           经过多番折腾,目前这些就是现在俺已发布项目运行的代码了。希望能帮到你
       */
       // 不是native调用可能会报错
        if(cc.sys.isNative){
            this.armatureDisplay._factory.clear(false);
        }
        //如果没有这三行,web平台会爆找不到动画的警告
       // 注意creator 1.9.3版本是使用属性名'_armatureName‘,而creator 2.0版本是'armatureName',不要问我为啥
        this.armatureDisplay._armatureName = null;
        this.armatureDisplay.dragonAsset = null;
        this.armatureDisplay.dragonAtlasAsset = null;
        /*
             以上,到上个说明,是我自己项目中creator版本升级后又降级多的,你可能用不上
        */
        cc.loader.loadRes(dbUrl_tex,dragonBones.DragonBonesAtlasAsset,function(err,atlasasset){
            self.armatureDisplay.dragonAtlasAsset = atlasasset;
            cc.loader.loadRes(dbUrl_ske,dragonBones.DragonBonesAsset,function(err,asset){
                // '_armatureName'是做龙骨骨骼时里面设置的名字而不是龙骨文件的名字,这个因该都懂的吧。
                let current_db_armature_name = monster_db_name + '_manual';
                self.armatureDisplay._armatureName = current_db_armature_name;
                self.armatureDisplay.dragonAsset = asset;
                self.armatureDisplay.playAnimation('wait',0);
                
            });
        });
}

谢谢好心人,我按照你的方法进行修改,下面是新修改的动态龙骨节点生成和载入方法:

在Chrome中没有任何问题(创建,载入和销毁节点),在模拟器,ios,android上创建和载入没有问题,但还是在销毁的时候会crush(和原来一样的错误。多点几次open和close就容易出现)。我反反复复测试了后,上传了对应的新的测试工程test.zip (956.7 KB),还烦劳费心了!
@413485698

我在Mac版的1.9.3的模拟器上测试多次反复点击open和close都没有出现奔溃的情况。
而且你的测试代码中

    onClickClose: function() {
        this.testNode.removeAllChildren();
    },

仅仅是将实例从父节点移除,并没有销毁龙骨的实例。你要确认是否是因为销毁龙骨引起的。

俺将其改为

    onClickClose: function() {
        let my_children = this.testNode.children;
        let len = my_children.length;
        for(let i = len - 1 ; i >= 0 ; i--){
            my_children[i].destroy();
        }
        // this.testNode.removeAllChildren();
    },

真正的销毁了,也没有报错。当然也是1.9.3版本。
个人认为目前做native最稳定的版本还是1.9.3。如果要做小游戏啥的,俺就不知道了。

非常感谢你耐心细致的解答,还帮我看了测试工程。我自己也按照这样的方式进行了修改。我又找了一台机器来安装1.9.3版本运行相同的工程,可以得出结论:

  1. 在1.10.2上,反复点击open和close后,必然会出现上述的crush
  2. 在1.9.3上,反复点击open和close后,一次都没出现上述crush
    现在我已经降版本降回1.9.3了,以后都不打算再升了^_^

再次非常感谢 @413485698,热心肠的人!

同样的问题,1.10.2尝试各种办法不能解决,无意间看到大神的帖子,降级顺利解决。。
creator真真不能随便更新,太坑了