繁体   English   中英

QOpenGLWidget和多线程

[英]QOpenGLWidget and multithreading

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

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

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

有什么建议吗?

谢谢。

典型的GUI框架并非旨在直接在多个线程中使用,并且QT也不例外。 尝试从不同的线程处理GUI内容通常会导致某种问题。

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

这就是我们要走的路:将整个GUI保留在一个线程中,并在另一个线程中进行用户输入处理。 处理完用户数据后,立即为您的GUI提供适当的信息。

Qt提供的这样做的方法是例如invoke函数或事件系统

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

渲染你的OpenGL的东西在预渲染或使用后使QML的功能QQuickWindow::beforeRendering()QQuickWindow::afterRendering()信号。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM