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