1

我曾经试图从一个子线程打开一个 GLUT 窗口,但遇到了很多讨厌的问题。我记得lists.apple.com上的这篇文章:

GLUT functions may only be called from the application's main thread

Mac OS X 上的 GLUT 在这方面有什么变化吗?是否有线程安全的 GLUT 可以让您从任何线程打开窗口?

如果 GLUT 不是一个选项,是否有一个小型库可以替换 GLUT 并且可以在任何线程上工作?

[编辑]

这是我的测试结果,由作为答案提出的各种解决方案触发:

  • GLFW 看起来不错,但没有编译(当前分支已有 3 年历史)
  • 琼脂是另一个伪装者,但它对于我的微小需求来说太大了
  • SDL 不兼容 BSD 许可证,它是一个巨大的代码库,应该适合单个文件
  • GLUT 不能在任何线程中运行。

我决定重新发明轮子(是的,有时这很好),最后的课程只有 200 行代码。它让我可以从任何线程打开和关闭一个窗口(openGL 在新线程中绘制),并且我可以完全控制垂直同步等(SDL 使用双缓冲 = openGL 慢)。我不得不绕过NSApp来正确启动和停止应用程序(否则它不使用事件循环)。

对于那些告诉我 OpenGL 不是线程安全的人来说,这并不完全正确:您可以运行多个 OpenGL 线程,并且绘制命令将在分配给该线程的 OpenGL 状态下执行。OpenGL 是线程特定的

如果有人需要一些基本代码来使用 Cocoa 创建 OpenGL 窗口:gl_window.mm

4

3 回答 3

3

GLUT 不是线程安全的。您需要使用您选择实施的任何解决方案来锁定原语。我建议在 Cocoa 中设置您自己的 GL 视图并重写 GLUT 提供的管道。

SDL视为现代 GLUT 替代品。它应该为您提供所需的所有跨平台。就跨平台线程而言,Boost 提供了一个可移植的

于 2010-01-29T20:05:17.293 回答
2

作为 GLUT 的替代品,请查看GLFW。它的目的和工作原理相似,但更好。而且它没有glfwMainLoop你的程序被卡住的;它允许您完全控制。自从我发现 GLFW 以来,我从来没有需要切换回 GLUT。

请注意,GLFW不是线程安全的,因为从不同线程调用 GLFW 函数是不安全的(常见问题解答条目)。但是,只要您从同一个线程调用所有 GLFW 函数,您就可以选择使用哪个线程。

于 2010-02-02T21:32:59.570 回答
1

不仅 GLUT 不是线程安全的,而且 OpenGL 是一个状态机,因此也不是线程安全的。话虽如此,您可以拥有使用 OpenGL 的多线程应用程序。只需确保所有 OpenGL 调用都来自同一个线程。

Mac OS X 上 GLUT 的下一步是Cocoa OpenGL 示例代码。这是一个真正的 Cocoa 应用程序,它演示了 Cocoa 设置 OpenGL 窗口的方式,并使用 Cocoa 事件模型进行交互。从这个起点开始,添加代码以在与 OpenGL 绘图代码不同的线程(或多个线程)中处理程序逻辑是相当容易的。

于 2010-02-03T05:57:01.733 回答