Qt QGLWidget从swapBuffers()上的线程块渲染OpenGL

时间:2011-11-06 15:35:20

标签: c++ qt opengl qglwidget

我有一个奇怪的问题,就是从主线程以外的其他线程将OpenGL渲染到QGLWidget。

Qt Developers有很多官方声明说,从一个不同的线程进行渲染是“完全可能的”。我按照下面的解释:

http://doc.qt.nokia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications

我几乎以同样的方式实现了它。唯一的区别是,我不使用QWorkspace和不同的GLWidgets,而是创建一个以GLWidget作为中心小部件的MainWindow。

当我启动应用程序时,渲染线程开始渲染具有随机位置三角形的帧。过了一会儿(有时是2秒,有时是10秒),线程开始在swapBuffers()调用上阻塞了很长时间。有时swapBuffers()会在几秒钟后自动返回。当我将鼠标指针移动到窗口小部件或主窗口上时,swapBuffers立即返回,只要我移动鼠标指针,swapBuffers()就不会阻塞。将鼠标移出窗口小部件或只是停止移动鼠标后,渲染会持续几秒钟,然后swapBuffers再次开始阻塞。

我绝对没有解释这种行为。我知道swapBuffers()会一直阻塞,直到一个帧完成,并且我也很清楚,在OpenGL缓冲区交换调用期间也可能发生等待vsync。但这应该在几毫秒内发生,而不会阻塞几秒钟。环境是带有GLX的X11。

有人知道wtf正在进行吗? 我甚至不知道如何找出问题所在。

是否有人试图从我在上面链接的文档中解释的不同线程实现渲染?

0 个答案:

没有答案