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里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。
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里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。
相关文章推荐
- removeSpriteFrames()后crash的问题
- cocosdx 关于CCSpriteFrameCache::sharedSpriteFrameCache()的问题
- 【Unity&DragonBones】使用DragonBones的函数不能放Update函数的问题
- EF学习和使用(八)你必须知道的效率问题根源之Expression<Func<TObject, bool>>与Func<TObject, bool>
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题
- Struts2中使用标签<s:checkboxlist>的问题
- 使用cocoapods遇到的爆栈crash问题再分析(彻底解决)
- 使用coredata导致的版本更新后程序crash的问题
- ASP.NET 使用List<T>.Remove 不生效
- <s:if test="">的使用问题
- 当多个<router />使用同一个组件的时候,切换页面地址,页面不刷新的问题
- spring mvc <mvc:annotation-driven>配置使用出现问题
- SpriteBuilder中使用Node类型的ccb动画节点删除时崩溃的问题
- 嵌套Fragment的使用及遇到The specified child already has a parent. You must call removeView()问题的解决
- python笔记31-使用ddt报告出现dict() -> new empty dictionary dict(mapping) 问题解决
- DragonBones导出骨骼动画供cocos2d-x使用
- 解决 spring mvc 3.+ 结合 hibernate3.+ 使用<tx:annotation-driven>声明式事务无法提交的问题
- Jsp页面关于BootStrap模态框和<a href onclick>事件不能同时使用,以及传参的问题
- SpringMVC同时使用<mvc:resources … />和日期转换Formatter时出现问题的解决方法
- MFC使用ADO连接数据库的问题:error C2059: 语法错误 : “<L_TYPE_raw>”