Изображения против Core Graphics - это прямое отличие. Методы визуализации закадровой / экранной графики более сложны до такой степени, что вам нужно использовать инструменты, чтобы узнать, что на самом деле происходит. Я попытался дать обзор здесь, но в этом ответе могли бы быть некоторые улучшения от более знающих людей.
GPU против процессора рендеринга
Графика всегда отображается на экране графическим процессором. Тем не менее, они могут быть сгенерированы 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:]
.
Растягиваемые изображения, независимо от того, считываются ли они из файлов изображений или создаются чертежом, занимают меньше памяти. Вытягивание является недорогой операцией для графического процессора.
Производительность - это проблема, только если ее недостаточно. Используйте все, что быстрее, чтобы кодировать, если не нажано иначе. Самая быстрая программа - та, которая первой выходит на рынок.
Интересное чтение: