Постепенное добавление к UIView

В моем приложении для iOS я создал представление, которое отображает путь, нарисованный пальцем, используя UIBezierPath в реальном время во время рисования. К сожалению, у меня проблемы с производительностью, так как путь становится длинным (несколько сотен вершин), и становится непрактичным рисовать весь путь каждый раз, когда вид обновляется.

Я попытался разбить путь на множество разных сегментов который позволяет мне рисовать только те сегменты, которые находятся в прямоугольнике, переданном мне в drawRect: , и это значительно помогает, но рисование все еще происходит медленно; многие сегменты перерисовываются без необходимости, когда секции добавляются к пути в область экрана, которая уже содержит части пути.

Я ничего не удаляю из представления, поэтому я попытался включить clearsContextBeforeDrawing и каждый раз рисовать только последний сегмент drawRect: называется, но кажется В Интернете есть большое количество анекдотических свидетельств того, что это свойство ни на что не влияет, и я также не мог заставить его вообще работать.

Как лучше всего ускорить рисование?

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

Похоже, я смогу сделать что-то, связанное с CALayer (с или без offscreen buffer) - мне непонятно, как работает рисование на слое и поможет ли это обойти какие-либо проблемы, которые я видел.Свойство contents принимает CGImageRef ; могу я сделать CGImage , а затем обновить его постепенно, не перерисовывая все? Кроме того, можно ли добавить к содержимому CALayer без перерисовки всего этого?

Мы будем благодарны за любые идеи.


Изменить: В качестве вознаграждения, пожалуйста, предоставьте пример того, как правильно инициализировать буфер изображения, нарисуйте на нем кубический контур Безье и соответствующим образом скопируйте его на экран. Также запишите, почему использовать ваш метод - я не знаю, является ли использование CGBitmapContextCreate лучшим способом или есть что-то еще, что я должен использовать.

7
задан Sophie Alpert 22 June 2011 в 00:46
поделиться