UIImage Производительность - PullRequest
       18

UIImage Производительность

2 голосов
/ 23 декабря 2009

Есть ли более элегантное решение для этого вопроса?

У меня есть около 70 изображений .png, которые я хочу загрузить и произвольно извлечь из массива при нажатии кнопки. (На экране может быть до 50 изображений одновременно, и каждое имеет размер 40-68 КБ с размерами 150X215, очевидно, что иногда будут возникать перегибы и закрытые изображения за изображениями на переднем плане). Следует ли мне использовать следующий пример для этого?

Пример:

-(void)viewDidLoad {
    UIImage *dogImage = [UIImage imageNamed: @"dog.png"];
    UIImage *catImage = [UIImage imageNamed: @"cat.png"];
    // And so on 68 more times followed by....

    for (int i = 1; i <= 70; i++) {
        UIImageView *dogView = [[UIImageView alloc]initWithImage:dogImage];
        UIImageView *catView = [[UIImageView alloc]initWithImage:catImage];

        // And so on 68 more times followed by.... 

        NSArray *animalArray = [[NSArray alloc] initWithObjects: dogView, catView, nil];

        // And so on 68 more times ending the array with ,nil

        // other code and and release calls, etc... 

    }

}

Это нормально для производительности или я собираюсь вывести приложение из строя при запуске или вскоре после этого?

Есть ли у кого-нибудь альтернативы этому способу?

Ответы [ 4 ]

1 голос
/ 23 декабря 2009

Хммм, это около 3,8 МБ изображений. Загрузка может занять некоторое время, пока пользователь сидит в ожидании появления представления. Попробуйте и посмотрите, сколько времени это займет.

Если изображение не нужно до нажатия кнопки, загрузите его! Вы тратите много времени на загрузку 70 изображений, если используете только одно из них за раз.

Я бы посоветовал вам не пытаться загрузить все это в ViewDidLoad. Если вам необходимо иметь их все в массиве одновременно, загрузите изображения в массив в отдельном потоке и, когда каждый из них будет загружен, добавьте его в массив.

0 голосов
/ 29 декабря 2009

Помимо загрузки изображений по требованию, вы можете также рассмотреть возможность их хранения с использованием сжатия текстур PowerVR. Вам не нужно использовать OpenGL, чтобы использовать этот режим сжатия - все графические API на iPhone настроены для его обработки. Файлы будут на диске больше, чем при PNG-сжатии, но прелесть в том, что их не нужно распаковывать в памяти - сжатые данные изображения отображаются напрямую.

0 голосов
/ 23 декабря 2009

Рисуя столько изображений одновременно, пора взглянуть на DrawRect.

Я бы сказал, что вы можете использовать метод imageNamed UIImage для загрузки изображений при нажатии кнопки. Это приводит к некоторому кешированию, поэтому повторяющиеся изображения будут загружаться быстрее, экономя вашу память.

Затем для рисования их на экране вы хотите использовать один вид и использовать методы рисования Quartz2D, чтобы разместить их на экране. Наличие всех их в качестве отдельных UIImageViews потребляет больше памяти и действительно замедляет работу, если вы выполняете прокрутку или анимацию.

0 голосов
/ 23 декабря 2009

Кроме того, вы должны помнить, что размер цитируемого изображения - это его сжатый размер. Как только это изображение используется в представлении, оно будет распаковано для отображения в графическом контексте. Несжатый размер 70 изображений будет чертовски большим, чем несколько мегабайт.

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

Я предлагаю только сохранять имена файлов изображений в массиве и загружать изображение только тогда, когда оно действительно требуется.

Кроме того, существуют некоторые различия в способе UIImage загрузки данных изображения в зависимости от того, какой метод вы используете для загрузки изображения. Я не достаточно уверен в своей памяти об этой ситуации, чтобы записать точные различия. Основная идея заключается в том, что imageNamed: будет загружать и кэшировать изображение для вас, в то время как (я думаю) initWithContentsOfFile будет загружать данные изображения по требованию, сохраняя вам некоторую память до самой последней минуты, когда изображение потребуется.

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