Повысить производительность примера Qt «Ускорение ваших виджетов с помощью OpenGL»?

#performance #qt #opengl #sample #qgraphicsscene

#Производительность #qt #opengl #пример #qgraphicsscene

Вопрос:

Я изучал статью Qt Quarterly о QGraphicsScene и OpenGL с целью использования ее в проекте. Я уже решил использовать Qt, учитывая его всестороннее превосходство, но пошел по пути реализации класса, производного от QGLWidget , однако мне все равно нужно было бы реализовать элементы пользовательского интерфейса. Использование методов из цитируемой статьи означало бы, что я мог бы также использовать Qt-виджеты и для пользовательского интерфейса, что сделало бы программу зависимой только от Qt (а не от CEGUI или подобного).

В любом случае, я запускал образец на настольном компьютере Linux, который оснащен Core i7 и довольно хорошей картой Nvidia, и он работает хорошо, однако на моем MacBook Pro 2010 года выпуска (Core i5 и Nvidia 330) он работает действительно очень плохо, особенно при взаимодействии с ним с помощью мыши.

Вопрос: кто-нибудь может предложить способы повышения производительности этого примера? Я не эксперт по Qt, но я думаю, что плохой отклик связан с вызовами update() из кода обработки мыши в сочетании с вызовами по времени update() в конце самого метода. Я думаю, что необходим фоновый поток для обновления перемещения объекта и синхронизированный, но постоянный вызов update() .

Кто-нибудь может прокомментировать это?

РЕДАКТИРОВАТЬ: я уже пытался удалить все вызовы update() , кроме сброса таймера, и это имеет очень небольшое значение.

Ответ №1:

К сожалению, производительность, которую вы получаете при использовании предложений из этой статьи, довольно низкая. Мы попробовали это во встроенной системе, и это было слишком медленно.

Для нас решением было использовать QML, новую «декларативную» возможность пользовательского интерфейса в Qt 4.7. У нас есть QML, встроенный в наше приложение на C . Мы наблюдаем значительное улучшение скорости благодаря наложению виджетов QML поверх нашей GL-сцены.

Мы используем виджет QDeclarativeView в нашем приложении на C , которое способно отображать наш QML-контент. Смотрите: http://doc.qt.io/archives/qt-4.7/qdeclarativeview.html.

Это должно нормально работать на рабочем столе (работает для меня в Ubuntu).

Другие полезные ссылки:

Использование привязок QML в приложениях на C

Интеграция кода QML с существующим кодом Qt UI

ОБНОВЛЕНИЕ! 20.01.2015: В Qt5.4 появился новый класс под названием QOpenGLWidget, который в основном позволяет использовать «классические» виджеты Qt с фоном OpenGL с высокой производительностью. Наконец-то они решили эту проблему напрямую! Прочитайте сообщение в блоге, а затем документы:

Запись в блоге Qt о QOpenGLWidget

Документы QOpenGLWidget

Комментарии:

1. Здорово знать, что есть выход из этой проблемы! Не могли бы вы рассказать немного больше об архитектуре вашего приложения? Используете ли вы традиционный пользовательский QGLWidget в рамках оконного подхода или используете QGraphicsScene / View?

2. Поддерживается ли QML для настольного Qt? Я не могу скомпилировать этот пример: talk.maemo.org/showthread.php?t=39913 поскольку я не могу найти QmlEngine и др., и, похоже, продолжается исследовательский проект для настольных Qt-компонентов: qt.gitorious.org/qt-components/desktop .

3. Я добавил еще несколько деталей. Дайте мне знать, если вам понадобится дополнительная помощь!