2013-07-31 108 views
18

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

原来我是这样做的另一种方式,但事实证明,你不能处理除OSX主窗口以外的任何事件,也可能是Windows,所以我将它切换到兼容这两个在未来。

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

+0

听起来没问题。还有另一个线程在这里... [链接](http://stackoverflow.com/questions/6172020/opengl-rendering-in-a-secondary-thread?rq=1) – user1961169

+0

@ user1961169谢谢,我已阅读你链接的线程。那个人在Linux/X11上遇到了麻烦,对我而言,这对我来说非常完美,它只是我不确定的OSX/Win32。不过,该主题中有一些评论意味着在这些平台上它应该没问题,所以感谢提醒我! – Ancurio

+0

唯一要保证的是操作系统的东西调用在App主线程中。如果不是,那么它会创建经常奇怪的行为(在展台赢和Linux),如句柄的失效,偶尔的例外,图形工件,场合GUI错误等... – Spektre

回答

2

我有一个应用程序可以在Mac/iOS/Windows上以这种方式构建(所有GL都在渲染线程中),但我不使用SDL。

我只是看了一下SDL的Cocoa_GL_CreateContext(在OS X上调用SDL_GL_CreateContext),它调用了我从主线程创建的上下文。

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

2

OpenGL和多线程基本上是敌人:任何时候只有一个线程可以'拥有渲染上下文' - 是的,每当线程切换时都可以切换GL渲染上下文,但考虑成本,从一位原始设备制造商的驱动程序到下一个,这不是很好的支持,并可能适用于某些人而不是其他人。 唯一合乎逻辑的(也是理智的)选择是将所有的OpenGL调用保留给一个线程(注意:有例外,任何线程都可以在gl中调用与流数据有关的事情,而不需要拥有渲染上下文)。 不幸的是,我们不能简单地按照建议在线程周围传递GL上下文,我们必须调用(w)glMakeCurrent,它告诉GL“此调用者线程现在拥有您”,但未能告诉其他线程...