QOpenGLWidget和多线程

时间:2017-03-13 10:11:34

标签: c++ multithreading qt opengl

我正在使用Qt和OpenGL开发3D应用程序。该应用程序由一个QMainWindow组成,其中QOpenGLWidget作为中心窗口小部件,QML UI作为停靠窗口小部件。我意识到用户输入和UI取决于渲染性能:如果我的应用程序以低fps运行,则用户输入并非全部被捕获,并且难以使用UI。

所以我在考虑在一个单独的线程中进行渲染。我尝试了几种技术,比如使用QTimer或QThread,但我总是遇到分享OpenGL上下文,调整大小或使用QPainter的问题。

我想知道是否在另一个线程中进行渲染是一种很好的方法。

有任何建议,意见吗?

感谢。

2 个答案:

答案 0 :(得分:2)

典型的GUI框架并非设计为直接从多个线程使用,而QT也不例外。试图从不同的线程做GUI内容通常会导致某种问题。

这些框架通常有一个内部事件队列,其中事件被放入然后一个接一个地处理,如果框架被正确使用,则确保仅从一个单独的线程访问GUI相关的东西。但是他们允许在队列中添加其他事件。

这里我们要走的路:将整个GUI保存在一个线程中,并在另一个线程中进行用户输入处理。处理完用户数据后,请适当地提供GUI。

Qt提供的方法是e。 G。 invoke功能或event system

答案 1 :(得分:0)

不要使用QOpenGLWidget。对所有内容使用单个QML窗口。

使用QQuickWindow::beforeRendering()QQuickWindow::afterRendering()信号在QML的预渲染或后渲染功能中渲染OpenGL内容。

那将使用QML的渲染线程,因此您不需要创建它。用例和同步在qt docs中解释:

http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html