Как лучше всего использовать слои и частичный рендеринг в iOS для скорости

Я работаю над графическим приложением, которое я написал с помощью Core Graphics. У меня есть буфер, который накапливает данные, и я отображаю их на экране. Это очень медленно, и я хочу по возможности не использовать openGL. По словам профилировщика, меня убивает рисование моих графических данных (которые состоят из нескольких точек, которые преобразуются в путь, за которым следуют вызовы AddPath, DrawPath).

Это то, что я хочу сделать, мой вопрос в том, как лучше всего это реализовать, используя слои/представления/и т.д..

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

Необходимо обновить только часть данных. Я хочу взять предыдущий экранный буфер, стереть данные прямоугольника (или закрыть его белым прямоугольником), а затем нарисовать только ту часть графиков, которая изменилась.

Затем я хочу объединить фоновый слой с графиками переднего плана, чтобы создать составное изображение. Для этого требуется, чтобы слой графика имел прозрачный фон, чтобы не загораживать сетку.

Я рассматривал использование CAlayer в качестве подслоя, но, похоже, он не обеспечивает простого способа рисования линии. CAShapeLayer кажется немного лучше, но похоже, что он может рисовать только одну линию. Я хочу, чтобы сетка состояла из нескольких строк.

Каков наилучший подход и комбинация объектов, чтобы позволить мне это сделать?

Спасибо, Реза


person reza    schedule 17.06.2013    source источник
comment
Как узнать, какая часть графика изменится при изменении масштаба (это в основном выбросить все и перерисовать только часть)? И вы постоянно добавляете новые точки, которые расширяют график (и в настоящее время каждый раз перерисовываете весь график)?   -  person Wain    schedule 17.06.2013
comment
для масштабирования я все перерисую. когда поступают новые данные, они рисуются слева направо, когда они достигают правого края, я начинаю сначала слева. поэтому мне нужно обновить только небольшую часть экрана, где отображаются новые данные.   -  person reza    schedule 17.06.2013


Ответы (1)


У меня был бы CGLayerRef, который использовался для рисования пути. Для каждой новой точки я рисовал только новый сегмент. Когда график достигал полной ширины, я создавал новый CGLayerRef и начинал рисовать в нем новые сегменты линий.

Что происходит с предыдущим слоем, когда он нарисован новым слоем, зависит от того, как отображается ваш график, но вы можете очистить раздел, который теперь находится под новым слоем (используя CGContextSetBlendMode(context, kCGBlendModeClear);), или вы можете смешать их вместе в каком-то другом способ.

Отрисовка слоев каждый раз, когда вы вносите изменения в линии, которые они содержат, относительно дешева по сравнению с отрисовкой всех сегментов самих линий.

Технически, CALayer также использовались бы для управления отрисовкой CGLayerRef на экране (через отношения делегата drawLayer:inContext:), но все отрисовки линий выполняются с использованием контекста CGLayerRefs, а затем CGLayerRef рисуются как единое целое в CALayers. контекст (CGContextDrawLayerInRect(context, frame, backingCGLayer);).

person Wain    schedule 18.06.2013