Multithreading QGLWidget';s paintGL()方法从哪个Qt线程调用?

Multithreading QGLWidget';s paintGL()方法从哪个Qt线程调用?,multithreading,qt,opengl,rendering,qglwidget,Multithreading,Qt,Opengl,Rendering,Qglwidget,假设我使用QGLWidget的paintGL()方法使用OpenGL绘制小部件。Qt调用paintGL()方法后,它会自动触发缓冲区交换。在OpenGL中,这种缓冲区交换通常会阻止调用线程,直到完成对背景缓冲区的帧渲染,对吗?我想知道哪个Qt线程调用paintGL和缓冲区交换。它是Qt UI的主线程吗?如果是,这难道不意味着缓冲区交换期间的块也会阻塞整个UI吗?总的来说,我找不到关于这个过程的任何信息 谢谢 在OpenGL中,这种缓冲区交换通常会阻止调用线程,直到完成对背景缓冲区的帧渲染,对吗

假设我使用QGLWidget的paintGL()方法使用OpenGL绘制小部件。Qt调用paintGL()方法后,它会自动触发缓冲区交换。在OpenGL中,这种缓冲区交换通常会阻止调用线程,直到完成对背景缓冲区的帧渲染,对吗?我想知道哪个Qt线程调用paintGL和缓冲区交换。它是Qt UI的主线程吗?如果是,这难道不意味着缓冲区交换期间的块也会阻塞整个UI吗?总的来说,我找不到关于这个过程的任何信息

谢谢

在OpenGL中,这种缓冲区交换通常会阻止调用线程,直到完成对背景缓冲区的帧渲染,对吗

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

如果是,这难道不意味着缓冲区交换期间的块也会阻塞整个UI吗

即使它真的阻塞了,也只会阻塞1/60秒。如果游戏速度减慢,可能是1/30。如果你真的很慢,1/15。用户最多只执行一次按键或鼠标操作仍将在消息队列中


阻塞的问题与UI无关。它的响应速度足够快,用户不会注意到。但是如果你有严格的时间安排(比如你可能会玩游戏),我建议你根本不要使用
paintGL
。你应该在你想要的时候进行渲染,而不是在QT告诉你的时候。

< P>我不经常使用QGWIDGET,但是考虑到是的,如果SavaBuffels:()是同步的,QT-GUI线程就被卡住了。这意味着在该操作期间,您将无法处理事件

无论如何,如果你在做这件事的时候遇到了困难,考虑一下阅读,它允许多线程OpenGL来克服这个困难。


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

感谢您的回答:-)。即使阻塞的特征依赖于实现,至少阻塞必须在某个点发生,对吗?否则,我们在CPU端对帧的请求会不断超过GPU的渲染能力。当谈到实际阻塞时间时,我想你指的是与显示器同步的等待时间?CPU端所需的时间与渲染时间本身的差异不是我们所能达到的最坏情况下的阻塞时间吗?我的应用目标不是游戏,而是更像科学可视化。我想我必须以低帧速率渲染非常复杂的帧。假设GPU渲染帧需要1秒,但在CPU端启动帧只需要几十毫秒。这将完全杀死我的主gui线程。@DyingSoul:“即使阻塞的特征依赖于实现,至少阻塞必须在某个时候发生,对吗?”不,它根本不必发生。如果驱动程序是线程化的或在内部使用三重缓冲区,它可以将您的命令排入队列,稍后将其发出。感谢您的回答和链接:-)。第二个链接中的“缓冲区交换线程”一段几乎解释了这个问题。谢谢