Сбой приложения при использовании больших изображений на iOS 4.0 - PullRequest
4 голосов
/ 09 сентября 2010

У меня возникла проблема с отображением больших изображений в режиме прокрутки, изображения размером 2,4 - 4,7 МБ.Отлично работает на 3GS и на симуляторе.Но всякий раз, когда я пытаюсь запустить его на 3G или iPod Touch 2G, происходит сбой.

Я искал в Интернете и обнаружил статью «imageNamed is evil».Хорошо, я изменил все свои вызовы изображений на imageWithContentsOfFile: но все равно происходит сбой, единственное отличие, которое я вижу, состоит в том, что теперь изображения освобождаются после того, как я просто покидаю вид.Но использование памяти все еще очень высоко.

Вот скриншот инструментов.alt text Первый пик - это видео, которое я показываю при запуске, затем в табличном представлении отображается много изображений, пока проблем не возникает.

alt text Когда я ввожу 1, 1 МБ - 2576 x 1000 изображений

alt text Когда я вхожу в изображение 4,8 МБ - 7822 x 1000

Кстати, приложение было протестированона iOS 4 и 3.1.2

У вас есть какие-нибудь советы?Потому что эта проблема сводит меня с ума.

Так как теперь большое спасибо!

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

Недавно я столкнулся с той же проблемой при тестировании приложения на моем 3G. Я закончил тем, что уменьшил изображения, размер которых превышает максимальное количество пикселей (я обнаружил, что 2 миллиона пикселей, похоже, надежно работают на моем 3G, но ответ hotpaw2, похоже, предполагает, что 1 миллион пикселей может быть более безопасной ставкой).

UIImage *image = // ...;
if (image.size.width * image.size.height > MAX_PIXELS) {
    // calculate the scaling factor that will reduce the image size to MAX_PIXELS
    float actualHeight = image.size.height;
    float actualWidth = image.size.width;
    float scale = sqrt(image.size.width * image.size.height / MAX_PIXELS);

    // resize the image
    CGRect rect = CGRectMake(0.0, 0.0, floorf(actualWidth / scale), floorf(actualHeight / scale));
    UIGraphicsBeginImageContext(rect.size);
    [image drawInRect:rect];
    UIImage *imageToDraw = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // imageToDraw is a scaled version of image that preserves the aspect ratio
}

Apple также предоставляет пример разработки приложения для создания фотогалереи, которое использует CATiledLayer для мозаичного изображения очень больших изображений. В их примере используются изображения, заранее нарезанные на плитки соответствующих размеров. Возможно нарезать изображения на плитки на лету в вашем приложении для iOS, но на устройстве это происходит довольно медленно. Проверьте сессию 104 WWDC этого года для примера PhotoScroller.

2 голосов
/ 09 сентября 2010

Графические процессоры в iPhone 3G и iPod Touch 1G / 2G имеют место только для текстур размером 1 к 1 к, что, похоже, также используется для рендеринга 2D-изображений.Все, что больше, должно быть выложено мозаикой, чтобы соответствовать аппаратному графическому рендереру.

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

0 голосов
/ 20 сентября 2010

В итоге я использовал UIWebView, мне пришлось использовать меньшие (в МБ, а не в размерах) изображения, но он работает, единственная проблема в том, что я не могу увеличить ... Используя scalePageToFit, я могу увеличивать, но изображение подходит по горизонтали, а не по вертикали, это sux.

Я постараюсь постоянно обновлять эту проблему.

Если у кого-то есть такая проблема, я бы посоветовал использовать веб-просмотр или версию адаптера для просмотра изображений Three20, которая лучше обрабатывает память.

...