Рисовать радиальные данные на iPhone с помощью CoreGraphics - PullRequest
2 голосов
/ 28 июля 2011

Я пытаюсь нарисовать данные радара поверх карты, используя CoreGraphics.Раньше я пытался нарисовать каждую точку данных индивидуально, обводя каждую отдельную точку данных, а затем заливая соответствующий цвет.Таким образом, для этого метода у меня было 4 точки местоположения и значение данных для каждой точки данных.Выполнение этого способа оказалось слишком дорогостоящим, поскольку для каждого изображения имеется от 30000 до 80000 точек данных.

Радиолокационные данные хранятся в радиальном формате (360 радиалов, каждый из которых содержит 230 точек данных).,Таким образом, вместо того, чтобы проходить через каждую точку данных, я выполняю только радиальные.И вместо пути вокруг каждой точки данных у меня есть путь вокруг каждого радиала.Затем я создаю и рисую линейный градиент (CGGradientCreateWithColors), используя массив цветов для этого конкретного градиента.

Этот метод рисует намного быстрее, чем раньше, но он все еще недостаточно быстр.Еще одна проблема, связанная с этим, заключается в «гладкости» данных при увеличении масштаба. Градиент смешивается между каждой точкой данных в радиальной плоскости, поэтому вы не можете видеть отдельные пиксели.Я не хочу этого делать.Я думаю, что именно отсюда исходит мое наибольшее снижение производительности (вычисление градиента между каждой точкой данных)Я бы предпочел, чтобы каждая точка данных отображалась отдельным цветом.Это выглядело бы лучше, и должно работать лучше.

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

Заранее спасибо, Росс

РЕДАКТИРОВАТЬ

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

Второе изображение - это градиент, который более эффективен, чем раньше (хотя и недостаточно эффективен), но выглядит неправильно.

This

This is using the gradient. Notice how the colors blend along the radials instead of showing each individual data point.

1 Ответ

1 голос
/ 28 июля 2011

У меня возникают проблемы с изображением того, что вы пытаетесь нарисовать (трудно представить, что на экране iPhone нарисовано 80 000 чего-либо, и каждая вещь должна быть больше пикселя ....), но вот некоторые мыслипо-вашему.

Во-первых, если у вас есть постоянная вещь, которую можно многократно рисовать, поставьте ее на CGLayer.Не CALayer, а CGLayer.Это аппаратно-оптимизированный объект для многократной «штамповки» одного и того же.Если вам нужно изменить цвета или даже применить градиент, вы можете применить их, используя маску или составив CGImage (последний обычно быстрее, если затем вы можете повторно использовать полученное изображение и не нужно ничего масштабировать).

Насколько это возможно, предварительно рассчитайте ваши градиенты и сохраните их в структурах данных.Попытка вычислить их в drawRect: часто является серьезным ударом по производительности.Точно так же, предварительно вычислите ваши пути, чтобы вам не приходилось строить их каждый раз, когда вы рисуете.

Если вы можете избежать масштабирования ваших слоев, вы можете установить их shouldRasterize в YES, что будетобычно улучшайте производительность, когда у вас есть сложные слои.С другой стороны, если вам нужно выполнить масштабирование или другие преобразования, то рисование CALayer и применение необходимого преобразования может быть очень быстрым.Вы также можете применять преобразования ко всему UIView, но если вам нужно преобразовать множество отдельных вещей, то в этом и заключается смысл CALayer.(На более раннем этапе вы, конечно, можете нарисовать CGLayer на CALayer.)

Я не понимаю, что вы имеете в виду, когда рисуете путь «дискретно».Путь - это непрерывная линия, определяемая контрольными точками.


EDIT : Исходя из ваших правок, я рекомендую поэкспериментировать с индексированным цветовым пространством (CGColorSpaceCreateIndexed()).Таким образом, ваш градиент не сможет включать промежуточные цвета, а вычисления должны выполняться быстрее на всем чертеже.

Вы также должны посмотреть на CGShading.(Я считаю, что это доступно для iOS, а не только для Mac.) Это может быть ближе к тому, что вы хотите, чем CGGradient.

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