Изображения против основной графики - PullRequest
21 голосов
/ 29 июня 2011

На устройствах iOS, в каких случаях лучше рисовать графику с помощью Core Graphics, чем с помощью файлов изображений?

Каковы преимущества этого с точки зрения ресурсов?

Ответы [ 2 ]

33 голосов
/ 29 июня 2011

Изображения против 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:].

Растягиваемые изображения, независимо от того, считываются ли они из файлов изображений или создаются чертежом, занимают меньше памяти. Вытягивание является недорогой операцией для графического процессора.


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

Интересное чтение:

2 голосов
/ 29 июня 2011

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

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