OpenGL上的多线程渲染

时间:2012-06-19 08:26:08

标签: c++ multithreading opengl rendering

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

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

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

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

5 个答案:

答案 0 :(得分:46)

  

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

DO NOT !!!

尝试多线程渲染渲染器时,您将获得 nothing 。基本上你遇到一个大的竞争条件,驱动程序将忙于同步线程,以某种方式理解它。

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

答案 1 :(得分:14)

我建议您阅读OpenGL联盟中的以下维基文章。

http://www.opengl.org/wiki/OpenGL_and_multithreading

简单来说,它很大程度上取决于您对OpenGl的多线程意味着什么,如果您有一个线程在做渲染部分而一个(或多个)做其他工作(即AI,物理,游戏逻辑等) )这是完全正确的。

如果你想让多个线程弄乱OpenGL,你就不能或者更好,但它会给你带来更多麻烦而不是优势。

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

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
}

请参阅: Concurrency and OpenGL - Apple Developer

和: Technical Q&A QA1612: OpenGL ES multithreading and ...

答案 4 :(得分:0)

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

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

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

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