OpenGL上的多线程渲染

fil*_*ehd 16 c++ opengl multithreading rendering

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

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

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

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

dat*_*olf 48

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

别!!!

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

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

  • @filipehd:即使这样使用多线程也没有意义."blitter"线程必须等待"渲染器"线程完成.多线程的全部意义在于保持同步工作; 你没有. (3认同)

Mau*_*tti 14

我建议从OpenGL Consortium阅读以下wiki文章.

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

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

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

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

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


小智 5

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