Утечка памяти: получено предупреждение памяти.Уровень = 1 & 2 в cocos2d - PullRequest
1 голос
/ 07 апреля 2011

Я новичок в cocos2d и столкнулся с проблемой памяти.
У меня предупреждение об уровне памяти 1 и 2.

  1. У меня есть две сцены в моей игре.

  2. В первой сцене (основное меню) у меня есть кнопка (при нажатии она заменяет сцену на 2-ю, т.е. (StartMoving))

  3. В StartMoving.h файл У меня есть инициализированные спрайты, массивы (которые я освобождаю в методе dealloc)

  4. В моем методе инициализации StartMoving у меня есть инициализированное фоновое изображение.к методу Allreset.

  5. Это мой код метода Allreset.

- (void) AllReset
{
while (x == 5)
{
x = 0;
[[CCDirector sharedDirector]replaceScene: [сцена основного меню]];// Замена сцены, когда X = 5

}  

CCLOG(@"%@: %@",NSStringFromSelector(_cmd),self);  
CCSprite *tra=[CCSprite spriteWithFile:@"tra.png"];             
    tra.position =ccp(800,115);                                     
    [self addChild:tra z:0 tag:2];                                  
        [tra1 insertObject:tra atIndex:0];      //tra1 is NSMutablearray which is realeased in dealloc                       

NSLog(@"tra is loaded....");  

//[[SimpleAudioEngine sharedEngine] playEffect:@"police.wav"];      

NSArray *name14 =[NSArray arrayWithObjects:@"app1.plist",@"app2.plist",@"app3.plist",@"app4.plist",@"app5.plist", nil];                                         

NSArray *name24 =[NSArray arrayWithObjects:@"app1.png",@"app2.png",@"app3.png",    @"app4.png",@"app5.png",nil];                                            

NSArray *name34 =[NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",nil];  

NSString *file14=[name14 objectAtIndex:x];      
NSString *file24=[name24 objectAtIndex:x];  
NSString *file34=[name34 objectAtIndex:x];  

int frame[]={3, 7, 11, 4, 5};             
float Fdelay[]={0.15, 0.2, 0.3, 0.1,0.5};           

CCSpriteFrameCache *frameCache4 =[CCSpriteFrameCache sharedSpriteFrameCache];  
[frameCache4    addSpriteFramesWithFile:file14];  
CCSpriteBatchNode *danceSheet4 = [CCSpriteBatchNode batchNodeWithFile:file24];  
[self addChild:danceSheet4];  

CCSprite *sprite4 = [CCSprite node];  
sprite4.position = ccp(395,155);  
[tra addChild:sprite4 z:1 tag:14];  

NSMutableArray *animFrames4 = [NSMutableArray arrayWithCapacity:frame[x]];  
for(int i = 1; i <= frame[x]; i++) {  
    NSString *namef4=[NSString stringWithFormat:@"%@%i.png",file34,i];  
    CCSpriteFrame *frame4 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:namef4];  
    [animFrames4 addObject:frame4];  
}  

CCAnimation *anim4 = [CCAnimation animationWithFrames:animFrames4 delay:Fdelay[x]];  
CCAnimate *animN4 = [CCAnimate actionWithAnimation:anim4];  
CCRepeatForever *repeat4 = [CCRepeatForever actionWithAction:animN4];    
[sprite4 runAction:repeat4];   
    id move= [CCMoveTo actionWithDuration:5.5f position:CGPointMake(240,115)];            
id easeout=[CCEaseOut actionWithAction:move rate:1.5f];  
id menudisp=[CCCallFuncN actionWithTarget:self selector:@selector(menudisplay:)];  
[train1 runAction:[CCSequence actions:easeout,menudisp, nil]];   

}

  1. Я показал только одну анимацию здесь, но всего 7 анимаций на одном и том же спрайте.

  2. Когда тра останавливается в заданной точке, отображается метка меню.и когда пользователь нажимает на ярлык, он начинает двигаться в том же направлении и исчезает с экрана.Как только весь спрайт выходит из экрана, вызывается один метод, который очищает память о tra (я думаю, с этим будут очищены только дети tra. Исправьте меня, если я ошибаюсь ..)

  3. После очистки памяти он снова вызовет метод Allreset с увеличенным значением x.

`- (void) Incrementingx
{x ++;
[selfAllreset];
}

`

Я также использовал следующие методы в applicationDidReceiveMemoryWarning метода appdelegate.m

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; * 1059[[CCTextureCache sharedTextureCache] removeUnusedTextures];
// [[CCDirector sharedDirector] purgeCachedData];// обратите внимание, что это прокомментировано

Приложение отлично работает на симуляторе, но на устройстве: (
, пожалуйста, помогите мне :(

Ответы [ 3 ]

4 голосов
/ 08 апреля 2011

Раньше я сталкивался с такой же проблемой, когда использовал много анимаций листов спрайтов и листов спрайтов и простых анимаций. Также при вызове разных сцен или переключении между сценами. Это все, что я сделал.

  1. Добавьте следующие коды в ваш dealloc, а не в Delegate.m
//IF you have particular spritesheets to be removed! Don't use these if you haven't any
[[CCSpriteFrameCache sharedSpriteFrameCache]removeSpriteFramesFromFile:@"ufoRotateThird2.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache]removeSpriteFramesFromFile:@"ufoRotateSecond1.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache]removeSpriteFramesFromFile:@"explode.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache]removeSpriteFramesFromFile:@"explodeR.plist"];

//Use these
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];


//Use these
[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCTextureCache sharedTextureCache] removeAllTextures];
[[CCDirector sharedDirector] purgeCachedData];

//Try out and use it. Not compulsory
[self removeAllChildrenWithCleanup: YES];
  1. В init сначала отключите все селекторы.
  2. Отмена планирования всех селекторов при переключении сцен
1 голос
/ 07 сентября 2011

вместо этого вы удаляете в dealloc.Better положить внутрь onExit.потому что dealloc иногда вызывает проблемы, когда вы хотите добавить spriteframes в следующих сценах.

-(void) onExit{
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    [super onExit];
}
1 голос
/ 30 августа 2011

Я сталкивался с этим предупреждением памяти раньше. Я получил его только на устройстве iOS, а не на симуляторе, и обнаружил, что это слишком много, поскольку фон работает (iOS 4.x). Просто закройте эти приложения, и предупреждение исчезнет.

...