2.3.3 龙骨动画bug

用资源管理器管理动态加载的龙骨资源,龙骨特效播放完删除节点,资源不释放。切换scene 时释放资源,报上https://forum.cocos.org/uploads/default/original/3X/7/c/7cdcdfb8b8a99f72250dcb8bd3724bceddf09e81.png面一样的警告。查询后发现,dragonBone.js 内 WorldClock中的 this._animatebles 数组一直保持着龙骨的Animate 状态。使用.
let factory = dragonBones.CCFactory.getInstance();
factory.clear();
factory.dragonBones.clock.clear();
浏览器解决了。但是打包android后,直接闪崩。
报错如下:
build/jsb-default/frameworks/cocos2d-x/cocos/editor-support/…\scripting/js-bindings/manual/jsb_conversions.hpp:332: bool native_ptr_to_seval(typename std::enable_if<!std::is_base_of<cocos2d::Ref, T>::value, T>::type *, se::Value *, bool *) [T = dragonBones::DragonBones]: assertion “cls != nullptr” failed’
2020-08-27 14:48:17.344 22706-22706/? A/DEBUG: #02 pc 00000000011eaddc /data/app/org.cocos2d.cm_trunksanguo-y8Qot4lhPusiFo8wnyDyaw==/lib/arm64/libcocos2djs.so (_Z19native_ptr_to_sevalIN11dragonBones11DragonBonesEEbPNSt6__ndk19enable_ifIXntsr3std10is_base_ofIN7cocos2d3RefET_EE5valueES6_E4typeEPN2se5ValueEPb+220)
2020-08-27 14:48:17.344 22706-22706/? A/DEBUG: #03 pc 00000000011ca810 /data/app/org.cocos2d.cm_trunksanguo-y8Qot4lhPusiFo8wnyDyaw==/lib/arm64/libcocos2djs.so
2020-08-27 14:48:17.344 22706-22706/? A/DEBUG: #04 pc 00000000011ca674 /data/app/org.cocos2d.cm_trunksanguo-y8Qot4lhPusiFo8wnyDyaw==/lib/arm64/libcocos2djs.so (js_cocos2dx_dragonbones_CCFactory_getDragonBonesRegistry(v8::FunctionCallbackInfov8::Value const&)+296)
2020-08-27 14:48:17.344 22706-22706/? A/DEBUG: #05 pc 0000000001a60884 /data/app/org.cocos2d.cm_trunksanguo-y8Qot4lhPusiFo8wnyDyaw==/lib/arm64/libcocos2djs.so (v8::internal::FunctionCallbackArguments::Call

最近也遇到这个问题,这个问题修复了吗

导致这个问题的原因是 ArmatureDisplay 组件在还未激活的情况下就将 Armature 对象添加到了 dragonBone 的更新队列,由于组件尚未 enable,因此也不会在 onDisable 和 onDestroy 中进行移除操作,导致了后续的报错。

可以 hook 一下 ArmatureDisplay 的 set armatureName 方法,如果组件还未激活则不执行 clock.add。

Object.defineProperty(cc.internal.ArmatureDisplay.prototype, "armatureName", {
    get: function() { return this._armatureName; },
    set: function(name: string) {
        ... 
        if (this._objFlags & CCObject.Flags.IsOnEnableCalled) {
            if (this._armature && !this.isAnimationCached()) {
                this._factory!._dragonBones.clock.add(this._armature);
            }
        }
    }
});
1赞

这样改,会影响正常使用吗?

目前为止没发现什么异常。另外 setAnimationCacheMode 方法也要做下类似的判断。

好的 谢谢

我是ios包我修改了cocos2d-jsb.js里面的东西但是我发现ios好像不走这里,是我改错了吗

看代码是这里没错,不过为什么 iOS 没走进来可能需要你自己调试看看了,我这边是 H5