我曾经试图从一个子线程打开一个 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