MFC:如何从不同的线程中绘制opengl?

时间:2014-10-09 08:01:20

标签: multithreading opengl mfc

我试图在60 fps的CWnd窗口中做一些opengl 1.0动画。我创建了CWnd的子类:

类COpenGLControl:public CWnd { ... }

我发现是否使用了内置计时器" setTimer()"并将其设置为每1000/60毫秒触发一次,所有opengl命令都能够正确渲染。但是,如果我使用单独的线程实现自己的计时器,则不会绘制任何内容。我得到的只是一个黑屏。

有没有办法从不同的线程发出opengl命令?

1 个答案:

答案 0 :(得分:1)

即使您不打算从多个线程发出GL调用,您也必须考虑OpenGL的线程规则:OpenGL上下文一次最多只能由一个线程使用。 (并且,每个线程,任何时候最多只能有一个活动的GL上下文)。这并不意味着您不能在多个线程中使用相同的上下文,或者在一个线程中创建它并在另一个线程中使用它,您只需要明确地"交出"从一个线程到另一个线程的上下文。

我不知道你是否在GL上下文处理中使用了一些进一步的图书馆,所以我假设你正在使用你的操作系统的本机API - 在这种情况下是wgl。相关功能是wglMakeCurrent()。因此,交出一个当前"在线程A到线程B中,线程A必须首先调用wglMakeCurrent(NULL,NULL),然后线程B才能通过wglMakeCurrent(someDC, myGLCtx)获取上下文。您当然可以多次切换GL上下文,但这会带来巨大的同步开销,应该避免使用。

来自您的评论:

  

可行吗?如果我也在计时器线程中创建了上下文?

是的,它会的。

只是旁注:创建根本不是问题,因为创建GL上下文不会自动使其成为当前的"到一个线程 - 所以你可以在线程A中创建它,然后直接将它当前线程B。