我有一个非常简单的Qt / OpenGL设置,我的GUI线程可以在工作线程中请求纹理上传。只要纹理可用,工作线程就会发回信号,然后GUI线程就可以使用它。
不幸的是,似乎有时需要大约50ms的时间才能使纹理在GUI上下文中完全可用。在这种情况下,绑定纹理的一部分显示为黑色。引入等待计时器可以有效解决此问题,但自然会减慢处理速度。所需的等待时间没有明显的规律,因此我想知道是否有一种方法可以确定纹理是否实际上已准备好在共享上下文中进行绑定。
我的设置如下:
在应用程序的早期,我通过调用来确保globalShareContext
可用
QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts );
在工作线程中,我创建了一个上下文并将其挂钩到globalShareContext
QOpenGLContext context;
context->setShareContext( QOpenGLContext::globalShareContext() );
然后我使用QOpenGLTexture
的一种上传功能将纹理数据移至GPU,并最终将其绑定到GUI线程中。
答案 0 :(得分:2)
不幸的是,似乎有时需要大约50毫秒才能使纹理在GUI上下文中完全可用。
您在这里遇到了几个问题
一个快速而肮脏的修复方法是在纹理上传之后添加一个glFinish()
命令,这将强制GL处理仍在队列中的所有命令 并阻塞调用线程直到完成。
但是,OpenGL Sync Objects是一个更好的解决方案。