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 和多线程的主要内容,如果未能解决你的问题,请参考以下文章

多线程和多进程模式有啥区别

python 多进程和多线程配合

python多线程和多线程问题

多进程和多线程有啥区别?

5天玩转C#并行和多线程编程

进程和线程单线程多线程和多进程