Нарисуйте большое количество путей в drawRect
Каков оптимальный способ визуализации большого числа путей < 512 в drawRect представления?
Я хотел бы нарисовать до 512 сегментов шириной 2 пикселя в режиме реального времени и не уверен, как это сделать с максимальной производительностью.
Создание и рисование всех этих сегментов как BezierPath или нескольких bezierPaths не достаточно быстро.
Я читал, что CGLayers можно использовать и визуализировать в целевой UIView.
После настройки слоя из контекста представлений и записи в слой в другом месте со своим собственным контекстом слой можно перетащить в представление с
CGContextDrawLayerAtPoint(context, point, layer);
Если что-то постоянно рисует в слое, когда оно должно уведомить UIView с помощью setNeedsDisplay и можно ли их синхронизировать? например, без отправки setNeedsDisplay в основной поток (это не правильно).
Каков наилучший способ визуализации такого количества путей / линий в слое после выполнения этой оптимизации?
1 ответ
Если вы хотите быть очень быстрым, используйте OpenGL ES;) В противном случае есть несколько общих соображений:
- Сделайте как можно меньше дублирующих работ. Например, если есть 200 фоновых полигонов, которые остаются неизменными между визуализациями, визуализируйте их в UIImage и нарисуйте этот UIImage в начале вашего -drawRect метода. Избегайте таких вещей, как
if(array.count < 3) { y += array.count } else { y += 3 }
так какint array_count = array.count; if(array_count < 3) { y += array_count } else { y += 3 }
быстрее! Хорошо, в этом случае нет большой разницы, но во многих случаях такие вещи имеют значение! Избегайте создания слишком большого количества объектов во внутренних циклах. - Используйте CADisplayLink.
- Профилируйте свой код, чтобы увидеть узкие места. Они в коде чертежа или в коде, который вычисляет полигоны?