1.9.2版本原生Android平台重启游戏龙骨崩溃 急!!!

版本是1.9.2
游戏切到后后长时间具体不能统计,5-10分钟不明显,30分钟以上再切回来调用cc.game.restart()有很大几率游戏崩溃。游戏中正常运行暂时没发现问题。

游戏中用到静态龙骨和动态资源加载的龙骨。

动态加载资源代码:
先加载DragonAtlasAsset ResourcesMgr.Get().loadRes()
加载完后在加载DragonAsset ResourcesMgr.Get().loadRes()

使用代码:
cc.sys.isNative && this.disPlay._factory.clear()
this.disPlay.armatureName = “”;
this.disPlay.animationName = “”;
this.disPlay.dragonAsset = null;
this.disPlay.dragonAtlasAsset = null;

this.disPlay.dragonAsset = DragonAtlasAsset;
this.disPlay.dragonAtlasAsset = DragonAsset;
this.disPlay.playAnimation(xx,xx);
this.disPlay.addEventListener(dragonBones.EventObject.COMPLETE,this.animCallback,this);

不确定是静态龙骨还是动态龙骨出的问题

崩溃堆栈

上传中…
堆栈不太全,没有原图了。具体就是从cc.game.restart()函数开始的

@jare @panda 求助!

@jare @panda sos!

稍等 我看下

感谢,因为上线游戏,这个崩溃很频繁。!

很抱歉 我用1.9打包并没有出现你的问题 我的场景中只有一个龙骨动画 我放置在后台30分钟 回来之后重新刷新游戏 并不会崩溃 华为4.4的安卓系统

是的所以我怀疑是不是动态加载龙骨资源,动态设置龙骨动作导致的?

我的项目里在一个固定场景里动态加载并使用了龙骨,游戏逻辑结束后再次切换到同一个场景。接着游戏逻辑.

加载场景A-> 进行游戏(加载龙骨并使用)->游戏结束后->
加载场景A-> 进行游戏(加载龙骨并使用)->游戏结束后->
加载场景A-> 进行游戏(加载龙骨并使用)->游戏结束后->

反复几次这样。然后开着游戏手机锁屏。长时间后再打开手机,cc.game.restart()后有很大几率出现崩溃,我不能必显出这个崩溃。

我怀疑是不是反复加载同一个场景的问题?动态创建的龙骨资源不会因为切换场景而释放,但是龙骨脚本会因为切换场景而释放。
暂时只有这一点怀疑!!

可以借鉴下我在这个帖子中建议的方案,用于场景切换前释放龙骨资源。
https://forum.cocos.com/t/creator/67685/12?u=337031709

龙骨是动态加载的资源。我管理了动态加载的资源。因为是反复加载同一个场景,所以没有主动释放掉这个资源。我不确定是不是这个问题。我可以在加载场景的时候先释放掉这个资源试试。!

hi 你说的这个方式,我这里并没有效果,还是重启后有几率会崩溃。场景文件勾选了自动释放资源。场景里静态龙骨资源不需要手动释放。动态资源我是用cc.loader.loadRes加载,切换场景前主动释放
let uuid = cc.loader.getDependsRecursively(asset)
cc.loader.release(uuid)
还会发现有崩溃。还有什么其它解决方法吗?

无法根据你的描述给予有效的优化方案,你可以在creator2.0以上版本尝试是否依然会崩溃,1.9版本短期内我们会记录问题后续修复,你考虑是否通过其他方式处理这个问题。

并不能升级到2.0以上,成本很大。谢谢的及时回复。我们再找找其它问题,找不到的话只能先放弃龙骨了。

并不能升级到2.0以上,成本很大。谢谢的及时回复。我们再找找其它问题,找不到的话只能先放弃龙骨了。!

std::size_t BaseObject::_hashCode = 0;
std::size_t BaseObject::_defaultMaxCount = 5000;
std::unordered_map<std::size_t, std::size_t> BaseObject::_maxCountMap;
std::unordered_map<std::size_t, std::vector<BaseObject*>> BaseObject::_poolsMap;
BaseObject::RecycleOrDestroyCallback BaseObject::_recycleOrDestroyCallback = nullptr;

void BaseObject::_returnObject(BaseObject* object)
{
const auto classTypeIndex = object->getClassTypeIndex();
const auto maxCountIterator = _maxCountMap.find(classTypeIndex);
const auto maxCount = maxCountIterator != _maxCountMap.end() ? maxCountIterator->second : _defaultMaxCount;

auto& pool = _poolsMap[classTypeIndex];
if (pool.size() < maxCount)
{
    if (std::find(pool.cbegin(), pool.cend(), object) == pool.cend())
    {
        pool.push_back(object);
    }
    else
    {
        DRAGONBONES_ASSERT(false, "The object aleady in pool.");
    }

    object->_isInPool = true;
    if (_recycleOrDestroyCallback != nullptr)
        _recycleOrDestroyCallback(object, 0);
}
else
{
    delete object;
}

}
当龙骨某个数据池超过5000后 回收的时候直接释放掉这个object,那么重启游戏时,必然崩溃。js中要及时dragonBones.BaseObject.clearPool 或扩大池数量 dragonBones.BaseObject.setMaxCount
但是这种崩溃的堆栈还是对应不到我崩溃的堆栈。不知道这种情况你们有没有线索。

1赞

已解决,重启时删除dragonBones::Armature类型指针时,dragonBones::Armature类型里slot数据会有其它引用导致重复删除崩溃。
和这个一个问题https://forum.cocos.com/t/dragonbones-crash/60209

(帖子被作者删除,如无标记将在 24 小时后自动删除)