2

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

谢谢

4

2 回答 2

2

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

无论如何,如果您在执行此操作时遇到困难,请考虑阅读这篇文章,该文章设法让多线程 OpenGL 克服这个困难。

更好的是,这篇文章很好地解释了这种情况,并介绍了 Qt 4.8 中新的多线程 OpenGL 功能,该功能现在处于候选版本中。

于 2011-10-16T09:40:47.380 回答
0

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

这取决于它是如何实现的。这意味着它因硬件和驱动程序而异。

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

即使它确实阻塞,它也只会阻塞 1/60 秒。如果您的游戏速度变慢,则可能是 1/30。如果你真的很慢,1/15。用户给出的最多一个按键或鼠标操作仍将在消息队列中。

阻塞的问题与 UI 无关。它的响应速度足以让用户不会注意到。但是如果你有严格的时间安排(比如你可能会参加一场比赛),我建议你完全避免paintGL。你应该在你想要的时候渲染,而不是在 Qt 告诉你的时候。

于 2011-10-15T20:39:20.233 回答