2010-10-21 69 views
1

我正在编写一个应用程序,您可以按下不同的按钮并且角色会变成动画。问题是我有很多图像,所以我需要为每个动画使用一个纹理。因此我需要发布精灵表和框架现金,但它似乎没有工作。内存分配越来越多,直到应用程序崩溃。下面是代码:多个动画和纹理与Cocos2d - 如何从内存中删除纹理?

// **** 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
[[CCTextureCache sharedTextureCache] removeAllTextures]; 

你不想这样做!这会从内存中删除所有纹理,然后重新加载所有仍在使用或下次使用它们的纹理。这会导致很大的开销,并且对游戏的性能通常不利。

相反,只取出纹理,你需要通过调用删除:

[CCTextureCache sharedTextureCache] removeTexture:TEX]。

为此,您还必须从Cocos2D节点层次结构中删除(释放)所有对动画的引用。

+0

谢谢!你有一个例子(声明纹理,去除纹理和所有参考)? – 2010-10-26 08:00:50

2

调用removeUnusedTextures将是清理未使用的材质使用的内存更好的选择:

[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 

也可以要求使用CCDirector::purgeCachedData,做内部同样的事情:

[[CCDirector sharedDirector] purgeCachedData];