Лучший подход к рисованию - PullRequest
       16

Лучший подход к рисованию

3 голосов
/ 09 сентября 2011

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

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

Я искал в Google и получил опцию OpenGL, но из-за нехватки времени я не хочу использовать openGLпотому что у меня нет опыта работы с OpenGL.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

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

  1. Нарисуйте растровое изображение в памяти, используя рабочий поток. Пока это происходит, основной поток может продолжать взаимодействовать с пользователем. После того как растровое изображение было перерисовано, рабочий поток сигнализирует о главном потоке, а основной поток затем копирует на экран заполненное растровое изображение - что очень быстро.

  2. Используйте основной поток, чтобы нарисовать растровое изображение непосредственно на экране, но посыпьте чертежный код вызовами wxApp :: Yield (). Это позволит GUI оставаться отзывчивым для пользователя в течение длительного процесса рисования.

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

0 голосов
/ 09 сентября 2011

Сохраняйте данные для рисования вместо того, чтобы всегда обновлять растровое изображение, и пусть основной цикл время от времени обновляет растровое изображение.

Таким образом, вы можете заставить программу никогда не зависать. Оборотная сторона, конечно, в том, что реактивность будет ниже (т.е. когда данные поступят, они не будут видны на экране в течение еще 20 миллисекунд, а не сразу).

...