CALayer против CGContext, что является лучшим подходом к дизайну? - PullRequest
12 голосов
/ 02 сентября 2011

Я экспериментировал с рисованием на iOS.Для практического упражнения я написал компонент BarChart.Ниже приведена диаграмма классов (ну, мне не разрешили загружать изображения), поэтому позвольте мне написать это словами.У меня есть NGBarChartView, который наследует от UIView имеет 2 протокола NGBarChartViewDataSource и NGBarChartViewDelegate.И код на https://github.com/mraghuram/NELGPieChart/blob/master/NELGPieChart/NGBarChartView.m

Чтобы нарисовать barChart, я создал каждый barChart как отдельный CAShapeLayer.Я сделал это по двум причинам: во-первых, я мог просто создать UIBezierPath и прикрепить его к объекту CAShapeLayer, и, во-вторых, я могу легко отслеживать касание barItem с помощью метода [Layer hitTest].Компонент работает довольно хорошо.Тем не менее, мне не нравится подход, который я использовал, чтобы нарисовать гистограммы.Отсюда и эта заметка.Мне нужно мнение эксперта о следующем

  1. . Используя CAShapeLayer и создавая BarItems, я действительно не использую UIGraphicsContext, это хороший дизайн?
  2. Мой подход создаст несколько CALayers внутриUIView.Существует ли ограничение, основанное на производительности, на количество CALayers, которые вы можете создать в UIView.
  3. Если хорошей альтернативой является использование методов CGContext *, то каков правильный способ определить, имеет ли конкретный путь
  4. С точки зрения анимации, например, мигает полоса, когда вы нажимаете на нее, дизайн слоя лучше или дизайн CGContext лучше.

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

Best, Murali

1 Ответ

15 голосов
/ 12 сентября 2011

IMO, как правило, любой вид рисунка требует большой вычислительной мощности. Компоновка кэшированного растрового изображения с помощью графического процессора обходится намного дешевле, чем их повторное создание. Поэтому во многих случаях мы кэшируем все рисунки в растровое изображение, а в iOS за это отвечает CALayer.

В любом случае, если ваши растровые изображения превышают лимит видеопамяти, Кварц не может объединить все слои одновременно. Следовательно, кварц должен рисовать один кадр на нескольких фазах. И это требует перезагрузки некоторых текстур в GPU. Это может повлиять на производительность. Я не уверен в этом, потому что iPhone VRAM, как известно, интегрирован с системной RAM. В любом случае, это правда, что над этим делом нужно больше работать. Если даже системной памяти становится недостаточно, система может удалить существующие растровые изображения и попросить перерисовать их позже.

  1. CAShapeLayer выполнит все работы CGContext (я полагаю, вы имели в виду это) вместо вас. Вы можете сделать это самостоятельно, если почувствовали необходимость в более низкой оптимизации уровня.

  2. Да. Очевидно, что все имеет ограничение по производительности. Если вы используете сотни слоев с большой альфа-смешанной графикой, это вызовет проблемы с производительностью. Во всяком случае, обычно этого не происходит, потому что составление слоев ускоряется с помощью графического процессора. Если линий вашего графика не так много, и они в основном непрозрачны, все будет в порядке.

  3. Все, что вам нужно знать, это то, что после того, как графические рисунки скомпонованы, нет способа разложить их обратно. Поскольку сама композиция является своего рода оптимизацией путем сжатия с потерями, у вас есть только два варианта (1) перерисовать всю графику, когда требуется мутация. Или (2) Создайте кэшированное растровое изображение для каждого элемента отображения (например, линии графика) и просто составьте в соответствии с вашими потребностями. Это то, что делают CALayers.

  4. Абсолютно слойный подход намного лучше. Любой вид рисования свободных форм (даже если он выполняется в графическом процессоре) требует гораздо большей вычислительной мощности, чем простая композиция растрового изображения (которая станет двумя текстурированными треугольниками) в графическом процессоре. Конечно, если ваши слои не превышают лимит видеопамяти.

Надеюсь, это поможет.

...