#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 с высокой производительностью. Наконец-то они решили эту проблему напрямую! Прочитайте сообщение в блоге, а затем документы:
Комментарии:
1. Здорово знать, что есть выход из этой проблемы! Не могли бы вы рассказать немного больше об архитектуре вашего приложения? Используете ли вы традиционный пользовательский QGLWidget в рамках оконного подхода или используете QGraphicsScene / View?
2. Поддерживается ли QML для настольного Qt? Я не могу скомпилировать этот пример: talk.maemo.org/showthread.php?t=39913 поскольку я не могу найти QmlEngine и др., и, похоже, продолжается исследовательский проект для настольных Qt-компонентов: qt.gitorious.org/qt-components/desktop .
3. Я добавил еще несколько деталей. Дайте мне знать, если вам понадобится дополнительная помощь!