在GLFW FAQ的第2.9项中指出:
重点是我的。
那么,主线程和其他线程有什么区别?
最佳答案
该声明
是错的。 OpenGL当然是线程安全的。
解决方法是:对于每个线程,可以将一个OpenGL上下文或不将OpenGL上下文绑定(bind)到可绘制对象(当前设置)。 OpenGL调用在进行调用的线程中处于事件状态的上下文中进行操作。在线程之间传输OpenGL上下文是完全可能的。为此,必须先将要传输的上下文解除绑定(bind),然后才能在另一个线程中反弹。
每个OpenGL上下文管理自己的一组状态变量和对象(纹理,缓冲区)。但是上下文可以被“纠缠”,即共享它们的对象空间。虽然国家仍然是个人。
单个可绘制对象(窗口,PBuffer)可以具有来自不同线程的多个上下文绑定(bind)到该上下文。如果来自不同线程的上下文绘制到相同的可绘制对象,则会出现竞争条件,并且结果不确定。但是,在进行深度测试的情况下,结果应该是合理的。但是,同时绘制单个可绘制对象将严重损害性能,因此最好避免这样做。
多个线程中的多个OpenGL上下文的主要用途是共享它们的对象,以便一个线程可以加载和更新另一上下文的数据。将帮助程序上下文绑定(bind)到屏幕外或隐藏的可绘制对象很有意义,以防止发生争用条件。
线程之间没有技术上的区别。从编程的角度来看,每个线程将具有稍微不同的语义,这是由运行的程序而不是系统体系结构强加的。对于大多数OpenGL应用程序,常规语义是主线程将创建窗口,绘制对用户可见的所有元素(包括OpenGL操作)并收集用户输入。从主线程启动的线程是没有直接用户交互的工作线程。但是,此任务分配纯粹是由您选择的,因为事实证明它可以很好地工作。但是,使用不同的方案是完全有可能的,有时是可取的。就像已经说过的那样,程序中的线程没有技术上的区别。在进程中,所有线程都是平等权利的公民。