Альтернативы рисования qpainter (производительность отстой на Mac) - PullRequest
8 голосов
/ 22 мая 2011

У меня есть класс, который отображает данные формы аудиофайлов в QWidget (см. Скриншот виджета ниже, тогда я все еще использовал градиент, который вызывал низкую производительность).

Аудиоданные отображаются в paintEvent непосредственно в виджете с использованием нескольких вызовов QPainter::drawLine (минимальное количество вызовов QWidget::drawLine эквивалентно ширине виджета => хотя бы одна строка для каждой координаты x ). Хотя этот подход довольно хорошо работает в Windows (в полноэкранном режиме paintEvent занимает около 4 мс), при запуске программы под MacOS производительность возрастает в 4-5 раз.

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

Итак, мой вопрос: кто-нибудь знает более быструю альтернативу QPainter.drawLine для рисования линий (решения, зависящие от платформы, могут подойти, если их можно использовать в paintEvent), или есть способ ускорить прокрутку? какая-то буферизация и т.д?

old screenshot of the widget (still used gradients, which caused poor performance)

Ответы [ 3 ]

5 голосов
/ 22 мая 2011

Текущая версия (4.7.x) Qt использует Core Graphics для рисования.Это может быть медленно, как вы узнали.В Windows он использует программный рендерер с действительно хорошими характеристиками.

Я предлагаю не рисовать на пройденном рисователе непосредственно в событии рисования.Вместо этого создайте QImage того же размера, что и область рисования виджета, и нарисуйте ее.Это будет использовать программный рендер, который намного быстрее.Затем нанесите QImage на художника при необходимости.

4 голосов
/ 23 мая 2011

Используйте OpenGL и QGLWidget , если хотите рисовать очень быстро.

0 голосов
/ 22 мая 2011

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

...