Cocos2dx Animation Packer 메모리 유출

2015 단어
이 소프트웨어 작성자와 연락을 취하고 있으며 당분간은 개인적인 견해로 작성자의 회답을 받은 후 업데이트한다.
프로젝트에서 애니메이션을 처리하는 데 애니메이션 패키지 도구를 사용하지만 사용 중에 애니메이션을 불러오고 애니메이션을 재생하면 메모리가 유출될 수 있다는 것을 발견하여 이해할 수 없었다.
분노 코드가 나타나면 다음과 같습니다.
CCDictionary *AnimatePacker::loadAnimations(const char *path )
{
    
 ......
	CCAnimation *animation = CCAnimation::createWithSpriteFrames(spriteFramesArray, animate.delay);//CCAnimation::createWithSpriteFrames(spriteFramesArray,animate.delay);
	CCAnimationCache::sharedAnimationCache()->addAnimation(animation,animate.name.c_str());

	spriteFramesArray->removeAllObjects();

 ......   
    return ret;
}
loadAnimation의 곳입니다. CCAnimationCache 안의 키를 주의하세요.
void AnimatePacker::freeAnimations(const char *path)
{
......

	set<string> animateNames=pathToNameMap[path];
	for (set<string>::iterator strItr=animateNames.begin();strItr!=animateNames.end();++strItr)
	{
		CCAnimationCache::sharedAnimationCache()->removeAnimationByName((*strItr).c_str());
		nameToAnimateMap.erase((*strItr));
	}
	pathToNameMap.erase(path);
}
free의 곳인데 마지막에 두 키가 다르다는 것을 발견할 수 있다.그래서 캐치 안의 자원이 정리되지 않았어요.
해법은 다음과 같습니다.
CCDictionary *AnimatePacker::loadAnimations(const char *path )
{
    
 ......
	for (unsigned int i=0;i<animates.size();i++)
	{
		......
		for (unsigned int j=0;j<spriteFrames.size();j++)
		{
			//animateNames.insert(spriteFrames[j]);
            CCLOG("spriteFrames[j] = %s", spriteFrames[j].c_str());
			CCSpriteFrame *spriteFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(spriteFrames[j].c_str());
//            CCLOG("spriteFrame = %p", spriteFrame);
			spriteFramesArray->addObject(spriteFrame);
		}
		animateNames.insert(animate.name);
		......
	}
	
    
    return ret;
}
load 함수에서 이중 for 안의 내부 for 순환을 위와 같이 수정합니다.
또는 애니메이션 사용이 완료되면 더 이상 사용할 필요가 없습니다.purgeCache.

좋은 웹페이지 즐겨찾기