Основные проблемы со скоростью с imageWithContentsOfFile - PullRequest
0 голосов
/ 23 мая 2011

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

Способ работы моего проводника изображений заключается в том, чтоон принимает изображение, разбивает его на фрагменты, кэширует эти фрагменты, а затем загружает только те фрагменты в память для отображения, которое необходимо отобразить на экране.Используя кучу NSLogs, мне удалось выяснить, где все замедление.Это не в самой функции imageWithContentsOfFile, это когда я пытаюсь вызвать эту строку:

CGContextDrawImage(context_ref,
                   CGRectMake(0, 0, imgWidth, imgHeight), tileImage);

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

Странно то, что разделение большого изображения таким образом занимает около 45 секунд (!),но когда я разделяю изображение из пакета, используя imageNamed, а не imageWithContentsOfFile, это занимает всего около 2 секунд.

У кого-нибудь есть идеи?Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

imageNamed использует кэширование и может уменьшить степень масштабирования.

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

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

, если вам нужно масштабировать изображение, а размер статический, определите размер для рисования и создайте UIImage, используя imageWithCGImage:scale:orientation: - или вы можете подойтипроблема аналогичным образом с использованием CoreGraphics apis тоже напрямую.

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

0 голосов
/ 23 мая 2011

Я думаю, что вы должны разделить ваше изображение. Потому что CGContextDrawImage примет полностью загруженный "tileImage".

Если ваш размер tileImage составляет 8 МБ, ваше приложение должно загрузить 8 МБ данных в память. Это занимает много времени для загрузки. и это может создать проблемы с памятью и т. д.

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

Он может избежать блокировки пользовательского интерфейса при загрузке большого изображения.

8-мегабайтное изображение JPG будет использовать более 8 Мб памяти, UIImage должен использовать несжатый формат для быстрого рисования.

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