QOpenGLWidget 和多线程
Posted
技术标签:
【中文标题】QOpenGLWidget 和多线程【英文标题】:QOpenGLWidget and multithreading 【发布时间】:2017-03-13 10:11:33 【问题描述】:我正在使用 Qt 和 OpenGL 开发一个 3D 应用程序。该应用程序由一个 QMainWindow 和一个 QOpenGLWidget 作为中心小部件和一个 QML UI 作为停靠小部件组成。我意识到用户输入和 UI 取决于渲染性能:如果我的应用程序以低 fps 运行,用户输入不会全部被捕获,并且很难使用 UI。
所以我正在考虑在单独的线程中进行渲染。我尝试了几种技术,例如使用 QTimer 或 QThread,但我总是在共享 OpenGL 上下文、调整大小或使用 QPainter 时遇到问题。
我想知道在另一个线程中进行渲染是否是一种好方法。
有什么建议吗?
谢谢。
【问题讨论】:
【参考方案1】:典型的 GUI 框架并非旨在直接从多个线程中使用,QT 也不例外。尝试从不同线程执行 GUI 操作通常会导致某种问题。
这些框架通常有一个内部事件队列,事件被放入其中,然后一个接一个地处理,如果正确使用框架,可以确保仅从一个线程访问与 GUI 相关的内容。但它们允许将其他事件添加到队列中。
这里我们要走的路:将整个 GUI 保存在一个线程中,并在另一个线程中进行用户输入处理。处理完用户数据后,立即为您的 GUI 提供适当的数据。
Qt 提供的方法是 e。 G。 invoke 函数或event system。
【讨论】:
【参考方案2】:只是不要使用QOpenGLWidget
。对所有内容都使用一个 QML 窗口。
使用QQuickWindow::beforeRendering()
或QQuickWindow::afterRendering()
信号在QML 的预渲染或后渲染函数中渲染您的OpenGL 内容。
这将使用 QML 的渲染线程,因此您无需创建它。 qt 文档中解释了用例和同步:
http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html
【讨论】:
以上是关于QOpenGLWidget 和多线程的主要内容,如果未能解决你的问题,请参考以下文章