Сбой iPad при анимации фонового изображения - PullRequest
0 голосов
/ 02 июля 2010

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

изображение

При игре с ним на iPad он вылетает всякий раз, когда я перемещаю его более 3-4 раз один за другим. У кого-нибудь есть подсказка, что может быть причиной этих сбоев? Я попытался проверить на утечки памяти и не смог найти, хотя я не уверен, что это действительно без них. Отладчик выдает предупреждение о перегрузке памяти, но я не думаю, что там так много ресурсов, потребляющих память. есть фоновое изображение jpg размером 2048X768 пикселей (около 150 КБ) и статическое изображение PNG размером около 90 КБ. кроме того, есть два звука: один около 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 заранее, Uri

1 Ответ

0 голосов
/ 02 июля 2010

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

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

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

...