У меня возникают проблемы с изображением того, что вы пытаетесь нарисовать (трудно представить, что на экране iPhone нарисовано 80 000 чего-либо, и каждая вещь должна быть больше пикселя ....), но вот некоторые мыслипо-вашему.
Во-первых, если у вас есть постоянная вещь, которую можно многократно рисовать, поставьте ее на CGLayer
.Не CALayer
, а CGLayer
.Это аппаратно-оптимизированный объект для многократной «штамповки» одного и того же.Если вам нужно изменить цвета или даже применить градиент, вы можете применить их, используя маску или составив CGImage
(последний обычно быстрее, если затем вы можете повторно использовать полученное изображение и не нужно ничего масштабировать).
Насколько это возможно, предварительно рассчитайте ваши градиенты и сохраните их в структурах данных.Попытка вычислить их в drawRect:
часто является серьезным ударом по производительности.Точно так же, предварительно вычислите ваши пути, чтобы вам не приходилось строить их каждый раз, когда вы рисуете.
Если вы можете избежать масштабирования ваших слоев, вы можете установить их shouldRasterize
в YES
, что будетобычно улучшайте производительность, когда у вас есть сложные слои.С другой стороны, если вам нужно выполнить масштабирование или другие преобразования, то рисование CALayer
и применение необходимого преобразования может быть очень быстрым.Вы также можете применять преобразования ко всему UIView
, но если вам нужно преобразовать множество отдельных вещей, то в этом и заключается смысл CALayer
.(На более раннем этапе вы, конечно, можете нарисовать CGLayer
на CALayer
.)
Я не понимаю, что вы имеете в виду, когда рисуете путь «дискретно».Путь - это непрерывная линия, определяемая контрольными точками.
EDIT : Исходя из ваших правок, я рекомендую поэкспериментировать с индексированным цветовым пространством (CGColorSpaceCreateIndexed()
).Таким образом, ваш градиент не сможет включать промежуточные цвета, а вычисления должны выполняться быстрее на всем чертеже.
Вы также должны посмотреть на CGShading
.(Я считаю, что это доступно для iOS, а не только для Mac.) Это может быть ближе к тому, что вы хотите, чем CGGradient
.