我从与主线程不同的线程将 OpenGL 渲染到 QGLWidget 时遇到一个奇怪的问题。
Qt Developers 有很多官方声明,“完全有可能”从不同的线程进行渲染。我遵循了以下解释:
http://doc.qt.nokia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications
我以几乎相同的方式实现它。唯一的区别是,我没有将 QWorkspace 与不同的 GLWidget 一起使用,而是我只是创建了一个以 GLWidget 作为中心小部件的 MainWindow。
当我启动应用程序时,渲染线程开始在随机位置渲染带有三角形的帧。一段时间后(有时 2 秒,有时 10 秒),线程开始在 swapBuffers() 调用上阻塞很长时间。有时 swapBuffers() 会在几秒钟后自发返回。当我将鼠标指针移到小部件或主窗口上时,swapBuffers 立即返回,只要我移动鼠标指针,swapBuffers() 就不会阻塞。将鼠标移出小部件或停止移动鼠标后,渲染会继续几秒钟,然后 swapBuffers 再次开始阻塞。
我对这种行为完全没有解释。我知道 swapBuffers() 会定期阻塞,直到一帧完成,而且我也很清楚,在 OpenGL 缓冲区交换调用期间也可能发生对 vsync 的等待。但这应该在几毫秒内发生,并且不会阻塞几秒钟。环境是带 GLX 的 X11。
有人知道这里发生了什么吗?我什至不知道如何找出问题所在..
是否有人尝试按照我上面链接的文档中的说明从不同的线程实现渲染?