Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 线程间OpenGL上下文共享延迟_Qt_Opengl_Qt5 - Fatal编程技术网

Qt 线程间OpenGL上下文共享延迟

Qt 线程间OpenGL上下文共享延迟,qt,opengl,qt5,Qt,Opengl,Qt5,我有一个非常简单的Qt/OpenGL设置,我的GUI线程可以在工作线程中请求纹理上传。一旦纹理可用,工作线程就会发出信号返回,GUI线程就可以使用它 不幸的是,有时似乎需要大约50毫秒的时间才能在GUI上下文中完全共享纹理。在这种情况下,绑定纹理的一部分显示为黑色。引入等待计时器有效地解决了问题,但自然会减慢处理速度。对于所需的等待时间没有明显的模式,因此我想知道是否有方法可以确定纹理实际上是否已准备好绑定到共享上下文中 我的设置如下所示: 在应用程序的早期,我通过调用 QCoreApplica

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

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

我的设置如下所示:

在应用程序的早期,我通过调用

QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts );
在工作线程中,我创建一个上下文并将其挂接到
globalShareContext

QOpenGLContext context;
context->setShareContext( QOpenGLContext::globalShareContext() );
然后,我使用
QOpenGLTexture
的上传功能之一将纹理数据移动到GPU,并最终将其绑定到GUI线程中

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

这里有几个问题

  • GL异步工作。某些GL命令RETUNR的事实并不意味着该命令的所有效果都已经实现(通常情况下恰恰相反)。因此,您不知道何时可以向其他线程报告纹理已准备就绪
  • 由于GL是异步工作的,它可能会等待其他GL命令排队后再执行它们。这意味着acutal纹理上载可能会无限延迟
  • 一个快速而肮脏的修复方法是在纹理上载之后添加一个
    glFinish()
    命令,这将强制GL处理仍然在队列中的所有命令,并阻止调用线程直到完成

    然而,现在有一个更好的解决方案