Cocos2dx Animation Packer 메모리 유출
프로젝트에서 애니메이션을 처리하는 데 애니메이션 패키지 도구를 사용하지만 사용 중에 애니메이션을 불러오고 애니메이션을 재생하면 메모리가 유출될 수 있다는 것을 발견하여 이해할 수 없었다.
분노 코드가 나타나면 다음과 같습니다.
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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.