2010-07-01 4 views
0

Я создал контроллер вида с PNG-изображением и длинным фоном jpg (ширина в два раза превышает ширину iPad - 2048 пикселей). перемещение png-изображения делает фоновое изображение перемещающимся влево плавно. увидеть это изображение для наглядного сравнения:Падение iPad во время анимации фонового изображения

image

Когда играл с ним на IPAD, он выходит из строя в любой момент я переместить его более 3-4 раз один за другим. Кто-нибудь знает, что может быть причиной этих сбоев? Я попытался проверить утечку памяти и не смог найти ее, хотя я не уверен, что она действительно свободна от них. Отладчик снимает предупреждение о перегрузке памяти, но я не думаю, что там столько ресурсов памяти. есть фоновое изображение jpg 2048X768 px (около 150 kb) и статическое изображение png около 90 kb. кроме того, есть два звука, один около 200 кб, который воспроизводится один раз и один из примерно 50 кб, который запускается на каждом событии с сенсорным движением. мой код реализации выглядит следующим образом:

#import "Page5.h" 

    #define kUpdateRate (1.0/60.0) 
    #define kRightX (1024.0) 
    #define kLeftX (0.0) 

    @implementation Page5 
    @synthesize animationTiny, bg, kMoveX; 
    @synthesize narPlayer, fxPlayer, narPath, fxPath; 


    - (void)viewDidLoad { 

    animationTiny.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"5-tiny-ipad-1" ofType:@"png"]]; 

    [super viewDidLoad]; 

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(flipIntervalEnded) userInfo:nil repeats:NO]; 
    } 

- (void)narPlayPath:(NSString *)path { 
     if (narPlayer!=nil) [narPlayer release]; 
     narPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
     narPlayer.delegate = self; 
     [narPlayer play]; 
    } 

    - (void)fxPlayPath:(NSString *)path { 
     if (fxPlayer!=nil) [fxPlayer release]; 
     if ([tmbHDPrefs integerForKey:@"SoundFX"]==YES) { 
      fxPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
      fxPlayer.delegate = self; 
      if ([narPlayer isPlaying]==YES) { 
       fxPlayer.volume = 0.2; 
      } 
      [fxPlayer play]; 
     } 
    } 


    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
     return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
    } 

    - (void)didReceiveMemoryWarning { 
     // Releases the view if it doesn't have a superview. 
     [super didReceiveMemoryWarning]; 

     // Release any cached data, images, etc that aren't in use. 
    } 


    - (void)viewDidUnload { 
     [super viewDidUnload]; 
     // Release any retained subviews of the main view. 
     // e.g. self.myOutlet = nil; 
    } 

    -(void)flipIntervalEnded { 
     timer=nil; 
     int trackNumber = 8; 
     NSString *narrationString = [NSString stringWithFormat:@"tmbtrack%i_%i",[tmbHDPrefs integerForKey:@"Narration"],trackNumber]; 
     narPath = [[NSBundle mainBundle] pathForResource:narrationString ofType:@"caf"]; 
      [self narPlayPath:narPath];  
     narPath=nil; 
    } 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [[event allTouches] anyObject]; 
     if ([touch view] == animationTiny) { 
      if ([timerFloat isValid]){ 
       [timerFloat invalidate]; 
       timerFloat = nil; 
      } 
     self.kMoveX = 30.0; 
      fxPath = [[NSBundle mainBundle] pathForResource:@"fx5-water-swoosh" ofType:@"caf"]; 
      [self fxPlayPath:fxPath]; 
      fxPath = nil; 
     timerFloat = [NSTimer scheduledTimerWithTimeInterval:kUpdateRate target:self selector:@selector(scrollView) userInfo:nil repeats:YES]; 
     } 
    } 


-(void)scrollView { 
     float oldX = self.bg.center.x - self.kMoveX; 
     float newX = oldX; 

     if (oldX < kLeftX) { 
      newX = kRightX; 
     } 

     self.bg.center = CGPointMake(newX, self.bg.center.y); 

     self.kMoveX -= 0.05; 

     if (kMoveX <= 0.0) { 
      kMoveX = 0.0; 
     }  
    } 

- (void)dealloc { 
     self.animationTiny = nil; 
     self.bg = nil; 
     self.narPlayer = nil; 
     self.fxPlayer = nil; 
     self.narPath = nil; 
     self.fxPath = nil; 
     [super dealloc]; 
    } 


@end 

TNX заранее, Ури

+1

Я не уверен, что вызывает крах, но я хотел сообщить вам, какие размеры изображений и звуков на диске не совпадают с объемом используемой ими памяти. Эти файлы хранятся в сжатом формате на диске, но их необходимо распаковать в памяти, чтобы они могли воспроизводиться/отображаться. 150 кбайт jpg может представлять собой несколько МБ в памяти. – chrissr

ответ

0

Вы находитесь в самом деле только загружается изображение один раз, но это на самом деле довольно большой для изображения. Изображения, однажды загруженные, сохраняются несжатыми в памяти. 2048x768 с 4 байтами на пиксель = 6,2 МБ, которые могут (не обязательно) дублироваться как текстура для графического процессора в базовом конвейере рендеринга. Это большой, но не глупый, огромный, в зависимости от того, что еще вы загружаете.

Нет гарантий, что это источник ваших проблем, но попробуйте его без изображения и посмотрите. :)

Если это проблема, посмотрите на CATiledLayer или загрузите ее в куски при прокрутке.

+0

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

Смежные вопросы