SDL 2.0:在主线程中创建窗口,但在单独的线程中进行所有渲染

21
这是我的目前设置:我在Linux上使用SDL进行OpenGL渲染。我在主线程中初始化SDL(SDL_Init)并创建应用程序窗口(SDL_CreateWindow ),然后将其传递给第二个线程。这个第二个线程从它创建一个OpenGL上下文(SDL_GL_CreateContext)并启动渲染循环,而主线程则监听事件。值得注意的是GL调用完全限于第二个线程;实际上,我大部分的应用逻辑都发生在那里,主线程只负责处理通过SDL传入的事件。
最初我是反过来做的,但事实证明你不能在OSX和可能也是Windows之外的任何线程中处理事件,所以我把它改为与这两个平台兼容。
我应该担心这在OSX / Windows上不起作用吗?在Linux上,我没有任何问题。互联网上有大量关于上下文共享和在多个线程中进行GL调用的信息,但我只想在一个不是主线程的线程中执行OpenGL。我不想继续编写我的应用程序,只是后来发现它在其他地方无法工作。

听起来对我没问题。这里还有另一个关于它的线程... [链接] (https://dev59.com/8G025IYBdhLWcg3wLilX?rq=1) - user1961169
@user1961169 谢谢,我已经阅读了你提供的帖子。那个人遇到的问题是关于Linux/X11的,而对于我来说,这方面完全没有问题,我只是对OSX/Win32不确定。然而,在那个帖子中有一些评论表明在这些平台上也应该没问题,所以谢谢你提醒我! - Ancurio
你唯一需要确保的是操作系统相关的调用在应用程序的主线程中进行。如果不是这样,就会经常出现奇怪的行为(在Windows和Linux上都会出现),比如句柄失效、偶发异常、图形伪影、GUI错误等等... - Spektre
只是出于兴趣,你真的需要多线程吗?还是只是因为你能做到而已?人们经常会毫无理由地过度复杂化应用程序。 - TPS
@Zammalad 在来到SO之前我已经做过了:线程 Sam或其他核心开发人员从未回应,但我得到了一些有趣的建议,比如“你可以使用clang的C块扩展来重新实现GLX” =P - Ancurio
显示剩余3条评论
2个回答

3
我有一个应用程序,可以在Mac/iOS/Windows上运行,其结构如下(所有GL都在渲染线程中),但我不使用SDL。
我刚刚查看了SDL的Cocoa_GL_CreateContext(由OS X上的SDL_GL_CreateContext调用),它会从我的主线程中进行一些设置上下文的调用。
因此,如果您遇到任何问题,请尝试在主线程中创建GL上下文,然后将其传递给渲染线程(而不是在渲染线程中创建GL上下文)。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接