Подтвердить что ты не робот

CALayer vs CGContext, который лучше подходит для проектирования?

Я экспериментировал с рисунком 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]. Компонент работает очень хорошо. Однако мне не нравится подход, который я использовал для рисования barCharts. Отсюда и эта записка. Мне нужно мнение экспертов о следующих

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

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

Бест, Murali

4b9b3361

Ответ 1

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

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

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

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

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

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

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