20

这是我当前的设置:我正在使用 SDL(目前在 Linux 上)进行 OpenGL 渲染。我初始化 SDL ( SDL_Init) 并在主线程中创建应用程序窗口 ( SDL_CreateWindow) 并将其传递给第二个线程。第二个线程从它创建一个 OpenGL 上下文 ( SDL_GL_CreateContext) 并启动一个渲染循环,而主线程监听事件。我认为重要的是要注意 GL 调用完全限于第二个线程;实际上我的大部分应用程序逻辑都发生在那里,主线程实际上只负责处理通过 SDL 传入的事件。

最初我以相反的方式执行此操作,但事实证明,除了 OSX 上的主线程和可能还有 Windows 上的主线程之外,您无法处理任何事件,因此我将其切换为将来与这两者兼容。

我是否应该担心这在 OSX/Windows 上不起作用?在 Linux 上,我什么都没有。互联网上有很多关于上下文共享和从多个线程执行 GL 调用的信息,但我想做的只是在一个不是主要线程的线程中执行 OpenGL。我不想继续编写我的应用程序,只是后来发现它在其他任何地方都行不通。

4

2 回答 2

3

我有一个在 Mac/iOS/Windows 上运行的应用程序,它的结构是这样的(渲染线程中的所有 GL),但我不使用 SDL。

我刚刚查看了 SDL Cocoa_GL_CreateContextSDL_GL_CreateContext在 OS X 上调用),它调用了我从主线程进行的调用以设置上下文。

因此,如果您遇到任何问题,请尝试在主线程中创建 GL 上下文,然后将其传递给渲染线程(而不是在渲染线程中创建 GL 上下文)。

于 2015-01-11T00:58:46.503 回答
0

OpenGL 和多线程基本上是敌人:在任何给定时刻只有一个线程可以“拥有渲染上下文” - 是的,您可以在线程切换时切换 GL 渲染上下文,但要考虑成本,并从一个 OEM 驱动程序中考虑这一点到下一个,它没有得到很好的支持,并且可能对某些人而不是其他人起作用。唯一合乎逻辑(且理智)的替代方法是将所有 OpenGL 调用保留在一个线程上(注意:有例外,任何线程都可以在 gl 中调用与流数据相关的东西,而无需拥有自己的渲染上下文) . 不幸的是,我们不能像建议的那样简单地在线程周围传递 GL 上下文,我们必须调用 (w)glMakeCurrent,它告诉 GL“这个调用者线程现在拥有你”,但没有告诉其他线程......

于 2015-04-13T14:00:36.687 回答