您的位置:首页 > 编程语言 > Go语言

DragonBones 在使用 CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames(); 后crash的问题

2013-08-31 10:15 399 查看
    在使用 DragonBones的 

Armature  对象的过程中,发现如果调用  

CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames(); 释放所有的frames纹理后,再去创建  Armature的时候,会crash

//调用过程

cs::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo

cs::Armature::create("filename");

会发现crash在  CCSprite的 spriteWithFrameName函数里面,猜测是没有了  

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile
去加载plist文件的过程,所以崩溃了。

阅读 相关的代码发现,最终是在

cs::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo 里面,调用了

m_pArmatureFileInfoDic->setObject,这个

m_pArmatureFileInfoDic就是保存的相关的信息。

当  

ArmatureFileInfo *ArmatureDataManager::getArmatureFileInfo()函数被调用的时候,就返回相应的ArmatureFileInfo 

最后调用  

addSpriteFrameFromFile(plistPath, imagePath,string(armatureName));

这个就是资源加载的地方,但是奇怪的是,这个加载资源的地方,是每次都执行的,那么原因就不是这里了。

后面发现是

addArmatureFileInfo
开始的地方,调用了 

ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);

  if(!fileInfo)

    {

        fileInfo = ArmatureFileInfo::create();

        fileInfo->armatureName = armatureName;

        fileInfo->configFilePath = configFilePath;

        fileInfo->useExistFileInfo = useExistFileInfo;

        

        if (fileInfo->useExistFileInfo.compare("") !=
0)

        {

            fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(fileInfo->useExistFileInfo);

        }

        

        

        m_pArmatureFileInfoDic->setObject(fileInfo, fileInfo->armatureName);

    }

这个意思是,如果 m_pArmatureFileInfoDic->objectForKey返回NULL的时候,才去m_pArmatureFileInfoDic->setObject
,猜测错误的原因是没有 执行这个,于是将开始的时候的

ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);

注释,替换成如下的代码:

    //ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);

    ArmatureFileInfo *fileInfo =
NULL;

    

    

    if(!fileInfo)

    {

        fileInfo = ArmatureFileInfo::create();

        fileInfo->armatureName = armatureName;

        fileInfo->configFilePath = configFilePath;

        fileInfo->useExistFileInfo = useExistFileInfo;

        

        if (fileInfo->useExistFileInfo.compare("") !=
0)

        {

            fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(fileInfo->useExistFileInfo);

        }

        

        

        m_pArmatureFileInfoDic->setObject(fileInfo, fileInfo->armatureName);

    }

结果发现work 了,于是,出现错误的原因找到了,可能在调用CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames()的过程中,m_pArmatureFileInfoDic里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐