18

我有一个多线程应用程序,我正在尝试使用不同的线程进行渲染。首先,我尝试在所有线程之间使用相同的渲染上下文,但我得到了其他线程的 NULL 当前上下文。我在互联网上读到一个上下文一次只能在一个线程上是当前的。

所以我决定做一些不同的事情。我创建一个窗口,从中获取 HDC 并创建第一个 RC。之后,我在线程之间共享这个 HDC,并且在我创建的每个新线程中,我都从同一个 HDC 获得一个新的 RC,并使其成为该线程的最新版本。每次我这样做时,返回的 RC 总是不同的(通常是前一个值 + 1)。我做了一个断言来检查是否wglGetCurrentContext()返回一个 RC,看起来它返回了刚刚创建的那个。但是在进行渲染之后,我没有得到任何渲染,如果我打电话GetLastError()我会得到错误 6(无效的句柄??)

那么,这是否意味着,尽管每个新的调用wglCreateContext()都给了我一个新的值,但不知何故,这意味着所有这些不同的值对于 OpenGL 调用来说都是相同的“连接通道”?

这是否意味着我将始终必须使线程上的先前渲染上下文无效,并在新线程上激活它?我真的必须一直进行这种同步,或者有没有其他方法可以解决这个问题?

4

5 回答 5

56

我有一个多线程应用程序,我正在尝试使用不同的线程进行渲染。

不!!!

尝试对渲染器进行多线程处理将一无所获。基本上你遇到了一个大的竞争条件,驱动程序将忙于同步线程以某种方式理解它。

为了获得最佳渲染性能,请将所有 OpenGL 操作保留在一个线程中。所有并行化都在 GPU 上免费进行。

于 2012-06-19T08:46:23.337 回答
14

我建议阅读以下来自 OpenGL Consortium的wiki 文章。

简而言之,这在很大程度上取决于您对 OpenGl 多线程的含义,如果您有一个线程执行渲染部分,而一个(或多个)线程执行其他工作(即 AI、物理、游戏逻辑等),它是完全正确。

如果您希望多个线程与 OpenGL 发生冲突,您不能,或者更好,但它确实会给您带来更多的麻烦而不是优势。

尝试阅读以下有关并行 OpenGL 使用的常见问题解答,以更好地了解此概念:

http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

于 2012-06-19T09:59:52.833 回答
5

在某些情况下,在不同线程中使用多个渲染上下文可能是有意义的。我已经使用这样的设计从文件系统加载图像数据并将这些数据推送到纹理中。

于 2013-06-03T11:53:05.280 回答
1

Mac OS X 上的 OpenGL 是单线程安全的;启用它:

#include <OpenGL/OpenGL.h>

CGLError err = 0;
CGLContextObj ctx = CGLGetCurrentContext();

// Enable the multi-threading
err =  CGLEnable( ctx, kCGLCEMPEngine);

if (err != kCGLNoError ) {
     // Multi-threaded execution is possibly not available
     // Insert your code to take appropriate action
}

请参阅: 并发和 OpenGL - Apple Developer

并且: 技术问答 QA1612:OpenGL ES 多线程和...

于 2015-03-31T01:22:26.633 回答
0

https://www.imaginationtech.com/blog/understanding-opengl-es-multi-thread-multi-window-rendering/

什么时候不应该使用多线程渲染?

当您不受 CPU 限制或加载时间不是问题时。

因此,如果您的 CPU 受限,请分开其他线程来完成 CPU 受限的工作,例如编解码器、纹理上传、计算......

于 2021-07-05T08:31:10.187 回答