2010-10-21 5 views
1

J'écris une application où vous appuyez sur différents boutons et un personnage s'anime. Le fait est que j'ai beaucoup d'images, donc j'ai besoin d'utiliser une texture pour chaque animation. Par conséquent je dois libérer la feuille de sprite et l'armature d'argent, mais cela ne semble pas fonctionner. La mémoire est allouée de plus en plus jusqu'à ce que l'application se bloque. Voici le code:Animations et textures multiples avec Cocos2d - Comment enlever la texture de la mémoire?

// **** 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]; 

J'essaie de libérer de la mémoire comme ceci:

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

Répondre

2
[[CCTextureCache sharedTextureCache] removeAllTextures]; 

Vous ne voulez pas faire ça! Cela supprime toutes les textures de la mémoire, puis recharge toutes celles qui sont encore utilisées ou la prochaine fois qu'elles sont utilisées. Cela entraîne un surcoût important et est généralement mauvais pour les performances de votre jeu.

Au lieu de cela, enlever seulement la texture vous devez supprimer en appelant:

[[CCTextureCache sharedTextureCache] removeTexture: tex]; Pour que cela fonctionne, vous devrez également supprimer (libérer) toutes les références à l'animation de la hiérarchie des nœuds Cocos2D.

+0

Merci! Avez-vous un exemple (déclaration de texture, suppression de texture et de toutes les références)? –

2

appel removeUnusedTextures serait un meilleur choix pour la compensation de la mémoire utilisée par les textures inutilisées:

[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 

Ou vous pouvez demander à utiliser CCDirector::purgeCachedData qui fait la même chose en interne:

[[CCDirector sharedDirector] purgeCachedData]; 
Questions connexes