Qopenglwidget和多线程

QOpenGLWidget and multithreading

本文关键字:多线程 Qopenglwidget      更新时间:2023-10-16

我正在使用QT和OpenGL开发一个3D应用程序。该应用程序由QMAINWINDOW组成,其Qopenglwidget为中央小部件,将QML UI作为码头小部件组成。我意识到用户输入和UI取决于渲染性能:如果我的应用程序以低FPS运行,则并非全部捕获用户输入,并且很难使用UI。

所以我正在考虑在单独的线程中进行渲染。我尝试了几种技术,例如使用QTimer或Qthread,但是我总是在共享OpenGL上下文,调整或使用QPainter时遇到问题。

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

有任何建议,建议?

谢谢。

典型的GUI框架不是直接从多个线程中使用的,QT也不是例外。尝试从不同线程进行GUI操作通常会导致某种问题。

那些框架通常具有内部事件队列,其中将事件放入然后进行一个接一个地处理,如果正确使用该框架,则可以确保仅从一个线程访问GUI相关的内容。但是他们允许在队列中添加其他事件。

在这里我们要走:将整个GUI保留在一个线程中,然后在另一个线程中进行用户输入处理。一旦处理用户数据,请适当地喂食您的GUI。

QT提供的方法是e。G。调用功能或事件系统。

只是不使用 QOpenGLWidget。为所有内容使用单个QML窗口。

通过使用QQuickWindow::beforeRendering()QQuickWindow::afterRendering()信号,在QML的前渲染或渲染后功能中渲染您的openGL事物。

将使用QML的渲染线程,因此您无需创建它。QT文档中解释了用例和同步:

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