Несколько анимаций и текстур с Cocos2d - Как удалить текстуру из памяти? - PullRequest
1 голос
/ 21 октября 2010

Я пишу приложение, в котором вы нажимаете разные кнопки, и персонаж получает анимацию. Дело в том, что у меня много изображений, поэтому мне нужно использовать одну текстуру для каждой анимации. Поэтому мне нужно выпустить спрайт-лист и фрейм наличными, но это, похоже, не работает. Память выделяется все больше и больше, пока приложение не падает. Вот код:

// **** DEFINE THE ANIMATION - EATING 1: ****

// Create a sprite sheet with all the images
CCSpriteSheet *spriteSheet = [CCSpriteSheet spriteSheetWithFile:@"Eating4.png"];

// This loads an image of the same name (but ending in png), and goes through the
// plist to add definitions of each frame to the cache.
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Eating4.plist"];    

[self addChild:spriteSheet];
///[self addChild:spriteSheet2];

// Load up the frames of our animation
NSMutableArray *eating1AnimFrames = [NSMutableArray array];
for(int i = 0; i <= 50; ++i) {
    if (i<=9){
        [eating1AnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Eating4_000%d.png", i]]];
    }
    else if (i>9) {
        [eating1AnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Eating4_00%d.png", i]]];
    }
}
CCAnimation *eatingAnim = [CCAnimation animationWithName:@"eating" delay:0.05f frames:eating1AnimFrames];

// Create a sprite for the mouse
CGSize winSize = [CCDirector sharedDirector].winSize;
self.mouse = [CCSprite spriteWithSpriteFrameName:@"Eating4_0000.png"];  
_mouse.position = ccp(winSize.width/2+20, winSize.height/2);
// Adjust the size of the Sprite:
[_mouse setScaleX: 1];
[_mouse setScaleY: 1];

//self.eatingAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:eatingAnim restoreOriginalFrame:NO]];
self.eatingAction = [CCAnimate actionWithAnimation:eatingAnim restoreOriginalFrame:NO];
[spriteSheet addChild:_mouse];

[_mouse runAction:_eatingAction];

Я пытаюсь освободить память следующим образом:

[[CCTextureCache sharedTextureCache] removeAllTextures]; [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Вызов removeUnusedTextures был бы лучшим выбором для очистки памяти, используемой неиспользуемыми текстурами:

[[CCTextureCache sharedTextureCache] removeUnusedTextures];

Или вы можете попросить использовать CCDirector::purgeCachedData, который делает то же самое внутри:*

2 голосов
/ 24 октября 2010
[[CCTextureCache sharedTextureCache] removeAllTextures];

Вы не хотите этого делать!Это удаляет все текстуры из памяти, а затем перезагружает все из них, которые все еще используются или при следующем использовании.Это приводит к значительным накладным расходам и, как правило, ухудшает производительность вашей игры.

Вместо этого удаляйте только текстуру, которую нужно удалить, вызывая:

[[CCTextureCache sharedTextureCache] removeTexture: tex];

Чтобы это работало, вам также придется удалить (освободить) все ссылки на анимацию из иерархии узлов Cocos2D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...