代码之家  ›  专栏  ›  技术社区  ›  Anna B

如何在OSX的主线程中使用GLUT?

  •  1
  • Anna B  · 技术社区  · 15 年前

    有一次我试图从一个子线程打开一个贪吃的窗口,遇到了很多棘手的问题。我记得lists.apple.com上的这篇文章:

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

    Mac OS X的供过于求有什么变化吗?有没有线程安全的过剩让你打开任何线程的窗口?

    如果GLUT不是一个选项,有没有一个小的库可以替代GLUT,并且可以从任何线程工作?

    [编辑]

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

    • GLFW看起来不错,但没有编译(当前分支已经3年了)
    • 阿格是另一个伪装者,但它太大了,我根本不需要它。
    • SDL与BSD许可证不兼容,它是一个巨大的代码库,可以放在单个文件中。
    • 臀大肌不能穿任何线。

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

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

    如果有人需要一些简单的代码来使用cocoa创建OpenGL窗口: gl_window.mm

    3 回复  |  直到 15 年前
        1
  •  3
  •   pestilence669    15 年前

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

    看一看 SDL 作为现代臀大肌的替代品。它应该给你所有你想要的跨平台。对于跨平台线程,Boost提供了一个可移植的 library .

        2
  •  2
  •   Thomas    15 年前

    作为臀大肌的替代品,看看 GLFW . 它的用途和工作原理相似,但更好。它没有 glfwMainLoop 你的程序被卡住了;它允许你完全控制。自从我发现GLFW后,我就再也没有必要转为“暴饮暴食”。

    注意,GLFW是 线程安全,即从不同线程调用glfw函数是不安全的( FAQ entry )但是,只要您从同一个线程调用所有glfw函数,您就可以选择将是哪个线程。

        3
  •  1
  •   Mr. Berna    15 年前

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

    下一步,从对Mac OS X的供过于求是 Cocoa OpenGL Sample Code .这是一个真正的cocoa应用程序,它演示了使用cocoa事件模型进行交互的方式来设置OpenGL窗口。从这一点开始,在OpenGL绘图代码的单独线程(或线程)中添加代码来处理程序逻辑相当容易。