0

Image exampleОсновные графики. Лучшая практика для динамического рисования с событием перемещения мыши?

Я рисую изображение выше в Core Graphics, используя вызовы CGContextAddLineToPoint. Само изображение не важно. Однако, как и в программе, форма основана на положении мыши. Проблема начинается там, где после поворота изображения, когда пользователь изменяет размеры углов, все нужно пересчитать и отобразить, пока мышь перемещается. И есть много вычислений.

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

Коробка будет содержать различные другие формы и линии, а пересчет каждого из них, подлежащих изменению при перемещении мыши, кажется утомительным и неэффективным. Мне интересно, что лучше всего реализовать, используя CGLayer или CGImageRef для этого и как вы их реализуете?

Основная проблема заключается в том, что я делаю так много вычислений, пока мышь перемещается, что изображение ОЧЕНЬ заметно отстает и даже прыгает вокруг, рендеринга все динамически.

ответ

1

В типичном приложении для рисования, вы обрабатывать два интерфейса события:

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

  2. В ответ на событие repaint вы рисуете фигуры с использованием заданных контрольных точек.

Это надежный подход. Он не забивает ваш процессор, вычисляя сразу несколько позиций фигуры. Однако, если вычисление новых опорных точек или перекрашивание измененной формы не может быть выполнено за долю секунды (т. Е. В 200 мс или меньше), вы заметите значительную задержку. Видимая форма будет отставать от положения мыши.

Предполагая, что ваши методы расчета и рисования более или менее эффективны и не могут быть оптимизированы для достижения времени выполнения 200 мс, вам необходимо прибегнуть к упрощенному отображению во время движения формы, то есть, как только вы начнете перемещать фигуру или изменять это размеры, появляется наброшенная схема, которая быстро следует за движениями мыши. Он не отображает конечные фигуры, а упрощенную схему. Контуры достаточно, чтобы поместить фигуру. Как только вы отпустите кнопку мыши, начнется реальный расчет и после небольшой задержки отобразится окончательная форма.

В этом случае реализация несколько сложнее:

  1. В ответ на мыши шаг события, установить новые ориентиры для набросков и попросить систему перекрашивать пораженную область ,

  2. В ответ на событие repaint вы рисуете старую форму (хранящуюся в CGImage) плюс контур сверху.

  3. В ответ на событие mouse up вы начинаете отдельный поток, чтобы пересчитать координаты фигуры и нарисовать его в CGImage.

  4. Когда поток закончен, попросите систему перекрасить пострадавший район. Теперь нарисуйте новое изображение (без контура).

+0

Забавно, что вы говорите, потому что это точно так же, как я сделал около дня назад. Я в основном делаю первоначальное «сохраненное изображение» исчезающим и рисую простой контур фигуры в различные расчетные точки в соответствии с моим сообщением над базой на позиции мыши. Затем, как только мышь отпустится, форма снова появится в ее окончательной истинной форме со всеми ее внутренними линиями. Однако в идеальном мире я хотел видеть, могу ли я как-то заставить все линии и все остальное динамически меняться. Как я могу хранить свои CGPaths и т. Д. В CGImage? – Gab

+0

Я думаю, вам нужно сделать правильный анализ вашего приложения. Измерьте, как долго выполняются вычисления и чертеж. Исходя из этого, вам нужно решить, возможно ли вообще избавиться от контура. Если это возможно, у вас будет больше информации, где можно оптимизировать, например. рисование или буферизация. Затем вы можете опубликовать свой код и задать другой конкретный вопрос. Но с текущей информацией, это просто догадки, и никто не сможет предоставить какой-либо код. – Codo

 Смежные вопросы

  • Нет связанных вопросов^_^