异步加载armature会卡住主线程

ccs.ArmatureDataManager.getInstance().addArmatureFileInfoAsync(getArmPath(“ani_0213”), function(percent){
if (percent < 1) return;
//something
}, getMainLayer());

异步加载一个armature,会起一个线程DataReaderHelper::loadData()和一个schedule DataReaderHelper::addDataAsyncCallBack, schedule里会每帧检测线程有没有load完armature,但我发现在loadData结束前,根本addDataAsyncCallBack根本就没机会调用,在游戏中表现就是在loadData结束前,游戏卡住了。 求怎么解决?

补充一下,我的是cocos2dx3.0 js版

而且我发现加载armature对应的plist比较费时,但这一步却是放在主线程里的。。。。。。

    while (!pDataInfo->configFileQueue.empty())
    {
        std::string configPath = pDataInfo->configFileQueue.front();
        _getFileMutex.lock();
        ArmatureDataManager::getInstance()->addSpriteFrameFromFile((pAsyncStruct->baseFilePath + configPath + ".plist").c_str(), (pAsyncStruct->baseFilePath + configPath + ".jpg").c_str());//pyj
        _getFileMutex.unlock();
        pDataInfo->configFileQueue.pop();
    }

这一步有时需要上百毫秒,却在主线程里。。

++++++++++++++load armature pkg/arm/ani_0213/ani_0213.ExportJson
+++++++++++parse in 11
+++++++++++decode armatures in 4
+++++++++++decode animations in 7
+++++++++++decode textures in 16
+++++++++++decode sprite frame in 143

简单测了一下,加载一个动画的时候其实最费的是加载sprite frame, 足足有143毫秒, 可这一步异步加载的时候,却是在主线程里的,突然发现异步加载一个armature,意义不是很大了。。。

感谢反馈,我们测试下 :7:

还有一个问题,就是正在 异步加载一个动画,然后去同步加载同一个动画就崩溃啦。。。

这么久了,没人回答,我就简单描述下我的解决办法吧。
首先更正一下,前面说的一点错误,其实子线程没有卡住主线程。
加载一个动画时,有以下5个步骤:
++++++++++++++load armature pkg/arm/ani_0213/ani_0213.ExportJson
+++++++++++parse in 0
+++++++++++decode armatures in 1
+++++++++++decode animations in 2
+++++++++++decode textures in 1
+++++++++++decode sprite frame in 112
这是在release下,每个步骤所花的时间(毫秒),可见,前面4个步骤忽略不计,最费时的是在第5步。
但现在在异步加载动画的时候,前4个步骤在子线程里,第5个步骤却在主线程里。
所以当前的异步加载动画意义不大。

所以我现在的解决方案是,异步加载第5步。改动较多,各种std::mutex,这里就不方便说了。

最后顺便说下addImagAsync貌似也是线程不安全的,在子线程里用到了_textures.find, 这个都没加锁,应该是有问题的,所以也不能用。

感谢楼主反馈。我提交给相关技术人员看下这个解决方案

解决没,真不知道别人是怎么用的,这么多BUgh

为啥用addSpriteFrameFromFile ? addSpriteFrameFromFile和 SpriteFrameCache::getInstance()->addSpriteFramesWithFile 有啥区别啊

异步加载卡住啊3.6版本啊。。。。。。