我正在使用Qt和OpenGL开发3D应用程序。该应用程序由一个QMainWindow组成,其中QOpenGLWidget作为中心窗口小部件,QML UI作为停靠窗口小部件。我意识到用户输入和UI取决于渲染性能:如果我的应用程序以低fps运行,则用户输入并非全部被捕获,并且难以使用UI。
所以我在考虑在一个单独的线程中进行渲染。我尝试了几种技术,比如使用QTimer或QThread,但我总是遇到分享OpenGL上下文,调整大小或使用QPainter的问题。
我想知道是否在另一个线程中进行渲染是一种很好的方法。
有任何建议,意见吗?
感谢。
答案 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