Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

low memory warning cocos2d


  • Zaloguj się, aby dodać odpowiedź
7 odpowiedzi w tym temacie

#1 izdum

izdum
  • 135 postów

Napisano 06 czerwca 2012 - 11:20

Hej, podczas odpalania aplikacji i śledzenia w instruments alokacji dostaje low memory warning i po chwili apka się wywala
mimo tego że łączna ilość mb zaalokowanych nie przekracza 6-7mb ( w momencie wywalenia jest 4,78mb).
Korzystam z cocosa w wersji 1.0.1.
Dodatkowo pojawiają mi się wycieki (pionowe czerwone kreski) i po sprawdzeniu gdzie w kodzie, instruments pokazuje mi np:
for(int i=1;i<21;i++){            
              [levelsID addObject:[NSString stringWithFormat:@"%d",i]];     
            }
i przy tym 90.9%
Już sam nie wiem, czy ja nie umiem tego czytać. Czy co innego.
Ktoś się spotkał z podobnymi problemami z cocosem? Można jakoś skutecznie oczyszczać pamięć po przeładowaniu kolejnej sceny?

#2 tomekh7

tomekh7
  • 73 postów

Napisano 06 czerwca 2012 - 16:02

A dokąd odwołuje Ci brakującą resztę 9.1%? Może nie releasujesz tej tablicy levelsID?

#3 izdum

izdum
  • 135 postów

Napisano 08 czerwca 2012 - 12:17

No właśnie wydaje mi się, że wszystko jest releasowane. Dorobiłem sobie nslogi w metodzie dealloc (bo przeczytałem że jeśli wszystko po drodze było dobrze zwalniane to metoda powinna się wywołać przy zmianie sceny) i w tej chwili wyświetla mi przy każdej scenie. Zauważyłem natomiast ze gdy z ekranu pierwszego przejdę do drugiego a później wrócę to w Instruments ilość zaalokowanej pamięci jest większa na pierwszym ekranie po powrocie niż była na starcie ( obecnie udało się zejść i są to niewielkie różnice ale ciągle nie mogę zejść do wart. początkowej). A czy można tworzyć sobie własny NSAutoreleasePool i między initem a releasem/drainem tworzyć sprite'y? Bo z tego co wiem one są obiektami autorelease (nie tworzę ich przy użyciu alloc init, tylko spriteWithFile). I czy da się stworzyć go globalnie i opróżniać np tuż przed zmiana sceny? Może takie coś przyczyniłoby się do mniejszego użycia pamięci.

#4 danteusz

danteusz
  • 527 postów
  • SkądWrocław-Psie Pole, Wroclaw, Poland, Poland

Napisano 09 czerwca 2012 - 08:04

Możesz spróbować ze wstawieniem w kluczowych miejscach autorelease pool, raczej nie zaszkodzi, a może rozwiąże problem

#5 izdum

izdum
  • 135 postów

Napisano 13 lipca 2012 - 11:54

Nie chcę zakładać nowego tematu bo w sumie to dalej tyczy się tego samego.

Mianowicie dostaję informację o wyciekach w takiej oto metodzie, wydaje mi się że wszystko jest poprawnie releasowane a mimo wszystko instruments pokazuje wycieki i % dla niektórych linijek.


 	    NSMutableArray *ar= [[NSMutableArray alloc]init];
         
            
            [ar addObject:[self createObstacle:@"image.png" :10 :170 :10]];
            [ar addObject:[self createObstacle:@"image.png" :20 :110 :0]];
            
           
            
            
            NSString *nr = [[NSString alloc]initWithString:@"2-6"];
            [self setLevel: nr];
            [nr release];
            NSString *lvl = [NSString stringWithString:@"6"];
            
            Levels *l = [[Levels alloc]init];
            [l setRO:ar];
            [l setSO:nil];
            [l setPO:nil];
            [l setLevel:level];
            [l setLvl:lvl];
            [l setBX:winSize.width/2-30];
            [l setBY:-10];
            
            NSNumber *x1 = [[NSNumber alloc]initWithInt:120];
            NSNumber *x2 = [[NSNumber alloc]initWithInt:190];
            NSNumber *x3 = [[NSNumber alloc]initWithInt:260];
            NSMutableArray *pos = [[NSMutableArray alloc]initWithObjects:x1,x2,x3, nil];
            [l setPos:pos];
            [l setCount:[pos count]];
            
            [pos release];
            
            
            [self.levelsArray addObject:l];
            [x1 release];
            [x2 release];  
            [x3 release];
            [ar release];
            [l release];

I metoda createObstacle która jest wywoływana bardzo wiele razy ( również (podobno) są problemy z zarządzaniem pamięcią chociaż ja już tego nie widzę:/ )

    
   
    if(image != nil){
    image = nil;
    }
    image = [CCSprite spriteWithFile:nameOfImage];
    [image setPosition:ccp(posx,poxy)];
    b2Body *obstacle_body;
    
    ..paramtery ciala box2d...
    
    Obstacle *ob1 = [[Obstacle alloc]init:obstacle_body :obstacleDef :obstacleShapeDef] ;
    [ob1 setAngle:angle];
    [ob1 setImage:image];
    
    [self setObs:ob1];
    [ob1 release];
    image = nil;

     return self.obs;


Próbowałem jeszcze bezpośrednio zwracać ten obiekt ob1 dając podczas tworzenia autorelease ale problem był w dalszym ciągu.
Będę bardzo wdzięczny jeśli ktoś coś zauważy i podzieli się spostrzeżeniami

#6 wachu16

wachu16
  • 2 postów

Napisano 06 kwietnia 2013 - 16:08

W sumie jestem tu nowy i nie za bardzo rozumiem informacje zawarte wyżej jeśli chodzi o problem z niskim poziomem pamięci. Jeśli byłby ktoś tak łaskaw i spróbował wyjaśnić na czym polega problem i z czym on jest związany/jakie wynikają z tego konsekwencje. Pierwszy raz zauważyłem daną wiadomość gdy miałem włączoną apke i sobie mykałem przez chwile. Nie wywalało mnie ani nic ale zdziwiłem się lekko. Zaznaczę że mam Iphona 4s 16gb z wersją 6.1.3 Proszę o odp. Z góry dzięki.

#7 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 06 kwietnia 2013 - 17:48

Jeżeli nie jesteś deweloperem, to te informacje zupełnie nie są dla Ciebie przydatne. Po prostu aplikacja, którą używasz, jest źle napisana.

#8 wachu16

wachu16
  • 2 postów

Napisano 06 kwietnia 2013 - 22:56

Czyli mam rozumieć że najlepiej będzie jak przestane korzystać z danej aplikacji tak?




Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych