【问题标题】:Win32 Message Loop, OpenGL Context in different threadsWin32消息循环,不同线程中的OpenGL上下文
【发布时间】:2012-12-21 05:59:04
【问题描述】:

在一个单独的线程中创建一个包含消息循环的窗口,然后在另一个线程中创建一个 OpenGL 上下文有什么问题吗?

【问题讨论】:

    标签: multithreading winapi opengl


    【解决方案1】:

    如果你小心点,你应该能够让它工作。请参阅parallel opengl faq

    Q: Why does my OpenGL application crash/not work when 
       I am rendering from another thread?
    A: The OpenGL context is thread-specific. You have to 
       make it current in the thread using glXMakeCurrent, 
       wglMakeCurrent or aglSetCurrentContext, depending on 
       your operating system.
    

    【讨论】:

    • 窗口是在单独的线程中创建的,而上下文是在主线程中创建的,主线程将在主线程中完成绘制。是否有必要使上下文成为当前的?
    • 我猜不会,只要你在一个线程中完成所有的 opengl 工作。
    【解决方案2】:

    你想做的事是完全可能的。更好的是,OpenGL 上下文可以在线程之间迁移,甚至可以与多个窗口一起使用,只要它们的像素格式兼容。一个限制是,OpenGL 上下文一次只能绑定在一个线程中,并且只能绑定未绑定的上下文。

    因此,您甚至可以在一个线程中创建窗口和上下文,然后取消绑定上下文,创建另一个线程并在辅助线程中将上下文重新绑定到窗口。没问题。

    您必须注意的唯一一件事是,OpenGL 本身不喜欢多线程。 API 本身或多或少是线程安全的,因为一次只能将一个上下文绑定到一个线程。但是,如果 OpenGL 操作在多个线程上产生,则所有需要进行的记账可能会引发令人讨厌的驱动程序错误,并且还会对性能造成一定的影响。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2010-09-18
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多