Кеширование основной графики - PullRequest
5 голосов
/ 19 ноября 2011

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

Есть ли что-то похожее для изображений, созданных с помощью Core Graphics?Я имею в виду изображения, созданные из контекстов методом UIImage *image = UIGraphicsGetImageFromCurrentImageContext();.

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

Может быть, даже хранить CGContextRef со всем рисунком в некоторой кеширующей структуре данных, я не совсем уверен,это возможно?

Моя цель - использовать только Core Graphics, чтобы мой пакет приложений был меньше и я получил независимость от разрешения, но я хотел бы повысить производительность, поскольку сложные процедуры рисования могут занимать много времени для обработки.

ОБНОВЛЕНИЕ: После некоторого тестирования производительности вот мои результаты.Каждый раз это в среднем более 100 прогонов, каждый из которых рисует 19 или 25 разных видов.Представления включены, прямоугольники, круги, а также текст в виде UILabels.Были использованы заливки, обводки, градиенты и тени.

Кэширование было реализовано, как обсуждалось в ответе, с NSDictionary, хранящим объекты UIImage.Каждый прогон имел индивидуальный кеш, который использовался в прогоне, но не для всех представлений (из 25 было 2 набора по 8, 2 набора по 6 из 19, которые были идентичны и могли быть кэшированы).

Вот времена: Симулятор iOS

19 просмотров

Без кэширования - средний прогон 11,667ms

Кэширование - средний прогон 10,321 мс

25 просмотров

Без кэширования - средний прогон 14,304 мс

Кэширование - средний прогон 13,509 мс

Устройство

19 просмотров

Без кэширования - в среднем 82,785 мс Кэширование - в среднем 77,831 мс

25views

Без кэширования - в среднем 107,977 мс Кэширование - в среднем 100,094 мс

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

1 Ответ

1 голос
/ 19 ноября 2011

У меня нет данных о производительности, чтобы подтвердить это, но я думаю, что кэширование UIImage при использовании imageNamed - это сохранение чтения файла с «диска» и преобразование png или чего-либо еще в данные UIImage.

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

Вы могли бы рассмотреть что-то вроде «фабричного» синглтона изображения, который лениво создает изображения по мере их запроса - поэтому в первый раз он будет выполнять необходимые графические операции ядра для создания UIImage, а затем возвращает завершенный объект,Каждое другое изображение будет просто храниться в виде ивара на вашем заводе.

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