Эффективный внеэкранный -рендеринг QPainterPaths (OpenGL и не -требуется решение OpenGL)

  1. В моем приложении я рисую карту улиц, используя QPainterна widget
    • . сделанные QPainterPaths, которые содержат заранее рассчитанные пути для рисования
    • widgetв настоящее время является QWidget, а не QGLWidget, но это может измениться.
  2. Я пытаюсь переместить картину с экрана -и разбить ее на части.
    • Я хочу нарисовать каждый фрагмент на QImageи, наконец, нарисовать все изображения на widget
    • QPainterPaths. уже разделены, так что проблема не в этом
    • проблема в том, что рисование на QImagesпримерно в в 5 раз медленнее , чем наQWidget
  3. Некоторые тесты производительности, которые я провел
    • значения времени представляют собой округленные средние значения за несколько прогонов
    • тестовый фрагмент содержит 100 QPainterPaths, каждый из которых содержит около 150 линейных сегментов
    • примерно 15 000 путей нарисованы с помощью QPainter::Antialiasingподсказки рендеринга, QPenиспользует круглую шапку и круглое соединение
  4. Помните, что мой источникQPainterPaths(и ширина линии + цвет; некоторыенарисованный, некоторыезаполненный)
    • Мне не нужны все остальные типы рисования QPainterподдерживает
    • Можно ли QPainterPathsпреобразовать во что-то другое, что можно нарисовать на OpenGL buffer, это было бы хорошим решением.
    • Я не знаком с OpenGLрендерингом вне экрана -и знаю, что существуют различные типы буферов OpenGL, большинство из которых предназначены не для рендеринга 2D-изображений, а для данных вершин.
Paint Device for chunk | Rendering the chunk itself | Painting chunk on QWidget
-----------------------+----------------------------+--------------------------
QImage                 |                    2000 ms |                   < 10 ms
QPixmap (*)            |                     250 ms |                   < 10 ms
QGLFramebufferObj. (*) |                      50 ms |                   < 10 ms
QPicture               |                      50 ms |                    400 ms
-----------------------+----------------------------+--------------------------
none (directly on a QWidget in paintEvent)          |                    400 ms
----------------------------------------------------+--------------------------

(*) These 2 lines have been added afterwards and are solutions to the problem!

Было бы хорошо, если бы вы могли также указать мне не -OpenGL -решение , так как я хочу скомпилировать свое приложение в двух версиях:OpenGLи версия non-OpenGL.
Кроме того, я хочу, чтобы решение могло отображаться в не -GUI-потоке .


Есть ли хороший способ эффективно рисовать фрагменты с экрана -?
Есть ли часть экрана -вне экрана QGLWidget(? OpenGLoff -экранный буфер ), который можно использовать в качестве устройства рисования для QPainter?

45
задан leemes 6 November 2014 в 13:19
поделиться