Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ QOpenGLWidget on CPU vs deprecated QGLWidget on GPU

Автор: FireBlack 30.1.2015, 15:03

Доброго времени суток.

Имеется http://doc.qt.io/qt-5/qgraphicsscene.html сцена, на которой расположено несколько item'ов. Также имеется http://doc.qt.io/qt-5/qgraphicsview.html на котором эта сцена отображается.
При использовании ui->graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))), во время перетаскивания item'а на сцене, загрузка процессора не превышает 50%.
При использовании ui->graphicsView->setViewport(new QOpenGLWidget), во время перетаскивания item'а, загрузка процессора не падает ниже 99%. Тоже самое происходит при использовании обычного виджета в качестве vewiport'а.

Из этого напрашивается очевидный вывод, что в моем случае с http://doc.qt.io/qt-5/qglwidget.html больше используется графический процессор, а с http://doc.qt.io/qt-5/qopenglwidget.html или http://doc.qt.io/qt-5/qwidget.html - центральный процессор (что не очень хорошо).
Меня QGLWidget полностью устраивает, но он отмечен как deprecated (или obsolete), что означает что его исключат в Qt 6.

В связи с вышесказаным, хочу спросить у Вас совета, что использовать: быстрый старый QGLWidget или медленный новый QOpenGLWidget?

P.S.:
Боюсь что оптимизировать код, чтобы снизить нагрузку на проц, не удастся т.к. при перемещении item'а перерисовывается весь background в QGraphicsScene, на котором рисуется большой QPixmap и куча линий между item'ами.

Автор: lanz 31.1.2015, 15:57

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

Автор: wiz29 2.2.2015, 12:50

А кто мешает переопределить void QGraphicsView::drawBackground ( QPainter * painter, const QRectF & rect ) [virtual protected] для конкретного региона?

Автор: FireBlack 2.2.2015, 14:18

Цитата(lanz @ 31.1.2015, 15:57) *
Скорее всего различаются настройки старого и нового виджета, проверьте что вы создаете контекст поддерживаемой версии и не используете неподдерживаемых расширений.

Ручками я контекст не создаю, использую тот, который сам создается в QOpenGLWidget.
QOpenGLWidget::​context() возвращает 0. Ручками задать контекст нельзя, подскажите в какую сторону копать.

Цитата(wiz29 @ 2.2.2015, 12:50) *
А кто мешает переопределить void QGraphicsView::drawBackground ( QPainter * painter, const QRectF & rect ) [virtual protected] для конкретного региона?

Как я уже говорил, у меня переопределен QGraphicsView::drawBackground. Как перерисоваь конкретный регион, я не представляю т.к. у меня в background рисуются связи между item'ами и при перемещении одного - проще перерисовать весь background.

Автор: lanz 3.2.2015, 9:25

Цитата
подскажите в какую сторону копать

Вот здесь посмотреть/задать формат
http://doc-snapshot.qt-project.org/qt5-5.4/qopenglwidget.html#format
http://doc-snapshot.qt-project.org/qt5-5.4/qsurfaceformat.html#defaultFormat
http://qt-project.org/doc/qt-4.8/qglwidget.html#format

Контекст не инициализирован еще, поэтому возвращает 0 скорее всего.

Автор: Litkevich Yuriy 6.2.2015, 19:22

Я часто использую SVG в графических элементах, и при перемещении маленького элемента над большим наблюдается значительное отставание элемента от указателя мышки.
Если для большого SVG устанавливать кэш

Раскрывающийся текст
item->setCacheMode(QGraphicsItem::ItemCoordinateCache);

то всё приходит в норму.

Может и тебе поможет?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)