Ответ 1
Изображения против Core Graphics - это тупое различие. Методы визуализации закадровой/экранной графики более сложны до такой степени, что вам нужно использовать инструменты, чтобы узнать, что на самом деле происходит. Я попытался дать обзор здесь, но этот ответ мог бы использовать некоторые улучшения от более знающих людей.
GPU против CPU рендеринга
Графика всегда отображается на экране графическим процессором. Тем не менее, они могут быть сгенерированы GPU или CPU, и происходить в коде пользователя или в отдельном процессе, называемом "сервер рендеринга". Вот обзор:
CPU, код пользователя:
- Основная графика и основной текст
-
drawRect()
. Результат обычно кешируется.
GPU, сервер рендеринга:
- CALayer с параметром
shouldRasterize
YES. Это создает кэш слоя и подслоев.
GPU, сервер рендеринга, очень медленный:
- CALayer с использованием масок (
setMasksToBounds
) и динамических теней (setShadow*
). - Непрозрачность группы (
UIViewGroupOpacity
).
GPU, быстрый:
- Создание изображений из файлов PNG. Растяжение в растягиваемых изображениях - это только GPU.
Обратите внимание, что кэширование полезно, только если кэш используется повторно. Если его сразу выбросить, это ухудшит производительность. Например, кэшированная анимация, в которой содержимое просто растягивается, может кэшироваться и использоваться повторно, но кэшированная анимация, в которой изменение содержимого будет иметь ужасную производительность.
Растровые изображения против рисования
Файлы изображений, как правило, быстрее.
- Файлы изображений могут быть загружены на диск заранее с использованием агрессивного кэширования.
- Изображения могут быть прочитаны и распакованы с диска на заднем плане.
- Изображения могут быть кэшированы в памяти, если вы используете
imageNamed:
вместоinitWithData:
Вне экрана требует больше работы, но позволяет достичь большего.
- Вы можете анимировать сложную графику без потери качества, потому что графика перезаписывается на каждом кадре.
- Вы можете создавать графику с i18n на лету.
- Вы должны отключить неявную анимацию Core Graphics, если она вам не нужна. Пример: UIView с закругленными углами (вам просто нужно округление, а не анимация).
- Рисование может быть достаточно сложным, так что вам нужно использовать инструменты, чтобы увидеть, куда идет время.
- Рисование с помощью drawRect, вероятно, кэшируется, если вы не используете маскирование, тени, сглаживание краев или прозрачность группы. Вы можете запросить вызов кэширования
-[CALayer setShouldRasterize:YES]
и-[CALayer setRasterizationScale:]
.
Растягиваемые изображения, независимо от того, считываются ли они из файлов изображений или создаются чертежом, занимают меньше памяти. Вытягивание является недорогой операцией для графического процессора.
Производительность - это только проблема, если ее недостаточно. Используйте все, что быстрее, чтобы кодировать, если не нажано иначе. Самая быстрая программа - та, которая первыми выходит на рынок.
Некоторое интересное чтение:
- Дизайн для iOS: графика и производительность. Не пропустите комментарии Энди Матущака. Я отредактировал оригинальный ответ с большим количеством контента из этой статьи.
- WWDC 2011 > Сессия 121: Понимание рендеринга UIKit
- WWDC 2012 > Основы> Сессия 238. Производительность приложения для iOS: графика и анимация
- WWDC 2012 > Основы> Сессия 211: Создание параллельных пользовательских интерфейсов на iOS
- WWDC 2012 > Основы> Сессия 223. Улучшение работы с представлениями прокрутки
- WWDC 2012 > Основы> Сессия 240: Полировка ротации интерфейса.