QGLWidget的paintGL()方法从哪个Qt线程调用?

时间:2011-10-15 20:24:56

标签: multithreading qt opengl rendering qglwidget

假设我使用QGLWidget的paintGL()方法使用OpenGL绘制到窗口小部件中。在Qt调用paintGL()方法之后,它会自动触发缓冲区交换。在OpenGL中,这个缓冲交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?我想知道哪个Qt线程调用paintGL以及缓冲区交换。它是主要的Qt UI线程吗?如果是,那是不是意味着缓冲区交换期间的块也会阻塞整个UI?我一般都找不到关于这个过程的任何信息..

由于

2 个答案:

答案 0 :(得分:2)

我不经常使用QGLWidget,但考虑是的,如果swapBuffers()是同步的,那么Qt GUI线程就会卡住。这意味着在该操作期间,您将无法处理事件。

无论如何,如果您在执行此操作时遇到困难,请考虑阅读this article,以便允许多线程OpenGL克服此困难。

更好的是,this article很好地解释了这种情况,并在Qt 4.8中引入了新的多线程OpenGL功能,该功能现在已经在候选发布版中。

答案 1 :(得分:0)

  

在OpenGL中,这个缓冲区交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?

这取决于它的实施方式。这意味着它因硬件和硬件以及驱动程序而异。

  

如果是,那是否意味着缓冲区交换期间的块也会阻塞整个UI?

即使它确实阻止,它也只会在1/60秒内完成。如果你的游戏速度减慢,也许是1/30。如果你真的很慢,1/15。用户提供的最多一个按键或鼠标操作仍将在消息队列中。

阻止问题与UI无关。它将足够响应以便用户不会注意到。但是如果你有严格的时间安排(例如你可能会参加游戏),我建议你完全避免使用paintGL。您应该在需要时进行渲染,而不是在Qt告诉您时进行渲染。