假设我使用 QGLWidget 的 paintGL() 方法使用 OpenGL 绘制到小部件中。Qt 调用paintGL() 方法后,会自动触发缓冲区交换。在 OpenGL 中,这种缓冲区交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?我想知道哪个 Qt 线程调用了paintGL 以及缓冲区交换。它是主要的 Qt UI 线程吗?如果是,那是不是意味着缓冲区交换期间的阻塞也阻塞了整个 UI?我一般找不到有关此过程的任何信息..
谢谢
假设我使用 QGLWidget 的 paintGL() 方法使用 OpenGL 绘制到小部件中。Qt 调用paintGL() 方法后,会自动触发缓冲区交换。在 OpenGL 中,这种缓冲区交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?我想知道哪个 Qt 线程调用了paintGL 以及缓冲区交换。它是主要的 Qt UI 线程吗?如果是,那是不是意味着缓冲区交换期间的阻塞也阻塞了整个 UI?我一般找不到有关此过程的任何信息..
谢谢
在 OpenGL 中,这种缓冲区交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?
这取决于它是如何实现的。这意味着它因硬件和驱动程序而异。
如果是,那是不是意味着缓冲区交换期间的阻塞也阻塞了整个 UI?
即使它确实阻塞,它也只会阻塞 1/60 秒。如果您的游戏速度变慢,则可能是 1/30。如果你真的很慢,1/15。用户给出的最多一个按键或鼠标操作仍将在消息队列中。
阻塞的问题与 UI 无关。它的响应速度足以让用户不会注意到。但是如果你有严格的时间安排(比如你可能会参加一场比赛),我建议你完全避免paintGL
。你应该在你想要的时候渲染,而不是在 Qt 告诉你的时候。