C++ 从swapBuffers()上的线程块进行Qt QGLWidget OpenGL渲染

C++ 从swapBuffers()上的线程块进行Qt QGLWidget OpenGL渲染,c++,qt,opengl,qglwidget,C++,Qt,Opengl,Qglwidget,我在从不同于主线程的线程将OpenGL渲染为QGLWidget时遇到了一个奇怪的问题 Qt开发人员有很多官方声明称,从不同的线程进行渲染“完全可能”。我遵循以下解释: 我几乎以同样的方式实现了它。唯一的区别是,我没有将QWorkspace与不同的GLWidget一起使用,而是创建了一个以GLWidget为中心的主窗口 当我启动应用程序时,渲染线程开始在随机位置渲染带有三角形的帧。一段时间后(有时2秒,有时10秒),线程开始阻塞swapBuffers()调用很长一段时间。有时swapBuffer

我在从不同于主线程的线程将OpenGL渲染为QGLWidget时遇到了一个奇怪的问题

Qt开发人员有很多官方声明称,从不同的线程进行渲染“完全可能”。我遵循以下解释:

我几乎以同样的方式实现了它。唯一的区别是,我没有将QWorkspace与不同的GLWidget一起使用,而是创建了一个以GLWidget为中心的主窗口

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

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

有人知道世跆联在这里的活动吗? 我甚至不知道如何找出问题所在


是否有人试图按照我上面链接的文档中的说明从不同的线程实现渲染?

是否在开头添加了XInitThreads()?您使用的是什么Qt版本?是的,我使用XInitThreads()(没有它,应用程序在几帧后崩溃)。我使用QT4.7.4考虑阅读这个并尝试4.8。应该没有必要,但作为一种尝试。谢谢你的评论。我以前读过文件,似乎这是唯一有意义的尝试。