iPhone Dev: большие последовательности PNG вызывают сбой? - PullRequest
1 голос
/ 12 июня 2009

Я создаю приложение, которое включает в себя несколько последовательностей изображений (5 последовательностей по 80 изображений в каждой). Он прекрасно работает в симуляторе iPhone, но заставляет мой iPhone перезагружаться при тестировании. Кстати, каждое изображение PNG имеет размер около 8 КБ. Кто-нибудь успешно создал подобное приложение? Использую ли я слишком много ресурсов для iPhone? Кто-нибудь?

UPDATE:
Спасибо всем за ответы! Я изменил свой код, чтобы использовать [UIImage imageWithContentsOfFile:] вместо [UIImage imageNamed:] Однако я все еще не могу предотвратить сбой приложения на моем iPhone. (обратите внимание, что мои pngs не такие большие, около 400x400px / 8k)

У кого-нибудь есть предложения?

Вот мой код:

    // code snippet:
    myFrames = [[NSMutableArray alloc] initWithCapacity:maxFrames];
            NSMutableString *curFrame;
            num = 0;
    // loop (maxframes = 80)
            for(int f = 1; f < maxFrames+1; f++)
            {
                curFrame = [NSMutableString stringWithString:tName];

                if(f < 10) [curFrame appendString:[NSString stringWithFormat:@"00%i",f]]; 
                else if(f>9 && f<100) [curFrame appendString:[NSString stringWithFormat:@"0%i",f]]; 
                else [curFrame appendString:[NSString stringWithFormat:@"%i",f]]; 

                UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:curFrame ofType:@"png"]];

                if(img) [myFrames addObject:img];
                [img release];
            }
// animate the images!
            self.animationImages = myFrames;
            self.animationDuration = (maxFrames * .05); // Seconds
            [self startAnimating];

Ответы [ 4 ]

3 голосов
/ 12 июня 2009

Лучший способ выяснить это - запустить приложение в разделе «Инструменты», используя «Утечки» или «Распределение объектов». Если вы видите восходящий тренд, который продолжает расти, у вас может быть утечка.

Если вы используете [UIImage imageNamed:], вы должны знать, что он предварительно кэширует оптимизированную версию, которая занимает больше памяти по сравнению с [UIImage imageWithContentsOfFile:]. Кроме того, до iPhone 3.0 кэш, созданный [UIImage imageNamed:], не освобождается при появлении предупреждения о памяти.

iPhone текущего поколения имеет только 128 МБ оперативной памяти, некоторые из которых используются самой ОС. Изображение 320x480, полностью несжатое с альфа-каналом, может занять 614 КБ. Если у вас есть 400 уникальных изображений в полноэкранном режиме, это более 128 МБ оперативной памяти, при условии, что оно загружено и кэшировано без сжатия.

1 голос
/ 12 июня 2009

Я видел, как приложения запускаются в симуляторе, а не на телефоне из-за неправильного форматирования PNG (даже одно неправильно отформатированное изображение может вызвать этот сбой). Убедитесь, что формат ваших изображений совпадает с форматом файлов PNG, предоставленных Apple в своих примерах приложений.

Это означает, что 400 полноэкранных изображений легко приведут к тому, что ему не хватит памяти, поскольку в памяти они будут занимать гораздо больше, чем 8 КБ. Не уверен, насколько велики эти изображения, но если они все в памяти, они должны быть очень, очень маленькими на iPhone.

1 голос
/ 12 июня 2009

Причина номер один, по которой приложение не зависает на симуляторе, но на телефоне будет память

На симуляторе iphone AFAIK память не ограничена 128 МБ, а на iphone, когда он достигает 128 МБ, он перезагружается. Поэтому проверьте использование памяти на симуляторе. Вы должны изменить способ загрузки изображений и / или проверить на утечки. Также проверьте, получаете ли вы предупреждения о нехватке памяти путем реализации методов (я забыл, как они называются: ()

0 голосов
/ 12 июня 2009

Первый ответ на ваш вопрос гласит, что, хотя ваши PNG могут занимать только 8 КБ на диске, это сжатая форма на диске. Когда он загружается в память, он распаковывается и намного больше, чем 8K. При разрешении 32 бит на пиксель изображение размером 400x400 будет иметь размер 640К.

Даже без альфа-канала вы смотрите на 480K. 480K x 80 кадров, то есть 38,4 МБ, что определенно ограничивает использование большего объема памяти, чем у iphone, чтобы предоставить ваше приложение сразу. Здесь - статья о некоторых проблемах с получением существенного объема памяти от iPhone OS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...