显示qt中gl计算的进度

Nob*_*ody 5 opengl parallel-processing qt

我有一个进程,用gl而不是cpu进行一些重要的数学运算(gl/gpu到目前为止比cpu快大约100倍)但是通常问题大小准备好了大约一分钟,所以我想要一个不错的进度条知道需要多长时间.

所以我将我的类设置为继承QObject并且currentProgress(int)每隔一段时间发出一次信号.不幸的是,我的程序在计算期间冻结,因此无法看到进度.我在调用中找到了解决方案,QCoreApplication::processEvents()这给了我另一个问题.在此调用期间,将触发整个窗口的重绘,这会导致我的计算在无限递归中被调用,因为它本身是由paint事件触发的.

现在所有这些问题都是告诉我的编程直觉槽的信号,我可能错误地设计了一些东西,所以我问你在qt中有一个刷新进度条的默认方法是什么?

另请注意:当我想将计算推送到另一个线程时,我可能需要创建一个新的GL上下文或者至少移动现有的上下文.所以,如果这是要走的路,有人可以向我解释如何在qt中实现这一目标吗?

编辑

为了使事情更清楚,我没有使用QGLWidget而是使用FBO.可能最好使用自己的上下文进行计算,但我不知道这是否是正确的方法.

新的消息

所以我试着听从你的建议,但偶然发现了一个问题.一个QGLContext似乎必须被连接到一个屏幕/ GUI对象,所以我不能创建一个屏幕外.

此外,我不能QGLWidget在其他线程中创建当前的.它返回错误QGLContext::makeCurrent(): Failed.进一步我读到的所有条目都是像我一样有问题的人:他们想在另一个线程中做渲染但没有找到解决方案.

Nic*_*las 3

在此调用期间,会触发整个窗口的重新绘制,这会导致我的计算在无限递归中被调用,因为它本身是由绘制事件触发的。

那么你不应该在绘制事件中触发你的计算。如果窗口是 OpenGL 窗口(即:GPGPU 内容渲染到窗口),那么您应该在计算期间隐藏它。如果它不是 OpenGL 窗口,则刷新它不应引发计算。

除非您使用 OpenGL 实际绘制某些内容,否则您应该使用离屏渲染目标。基本上,您创建一个 GL 窗口,然后创建一个与使用WGL_ARB_pbuffers(或 GLX 等效项,具体取决于您的 GUI 系统)共享对象的新上下文。这是一个离屏渲染目标。然后你摧毁原来的窗户。

至于线程,不要忘记:即使你有两个 GL 上下文,你也只有一个 GPU。因此,如果您使用 OpenGL 绘制到窗口,并使用 OpenGL 进行一些计算,则这可能无法全部解决。