线程之间的OpenGL上下文共享延迟

时间:2019-08-31 14:12:40

标签: qt opengl qt5

我有一个非常简单的Qt / OpenGL设置,我的GUI线程可以在工作线程中请求纹理上传。只要纹理可用,工作线程就会发回信号,然后GUI线程就可以使用它。

不幸的是,似乎有时需要大约50ms的时间才能使纹理在GUI上下文中完全可用。在这种情况下,绑定纹理的一部分显示为黑色。引入等待计时器可以有效解决此问题,但自然会减慢处理速度。所需的等待时间没有明显的规律,因此我想知道是否有一种方法可以确定纹理是否实际上已准备好在共享上下文中进行绑定。

我的设置如下:

在应用程序的早期,我通过调用来确保globalShareContext可用

QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts );

在工作线程中,我创建了一个上下文并将其挂钩到globalShareContext

QOpenGLContext context;
context->setShareContext( QOpenGLContext::globalShareContext() );

然后我使用QOpenGLTexture的一种上传功能将纹理数据移至GPU,并最终将其绑定到GUI线程中。

1 个答案:

答案 0 :(得分:2)

  

不幸的是,似乎有时需要大约50毫秒才能使纹理在GUI上下文中完全可用。

您在这里遇到了几个问题

  1. GL异步工作。某些GL命令调整器的事实并不意味着该命令的所有效果都已经实现(通常恰恰相反)。因此,您不知道何时可以向其他线程报告纹理已准备就绪。
  2. 由于GL工作异常,因此它可能会等待其他GL命令排队后再执行它们。这意味着原始纹理的上传可能会无限延迟

一个快速而肮脏的修复方法是在纹理上传之后添加一个glFinish()命令,这将强制GL处理仍在队列中的所有命令 并阻塞调用线程直到完成。

但是,OpenGL Sync Objects是一个更好的解决方案。