2010-01-29 41 views
1

我曾經試圖從一個子線程打開過剩窗口,並得到了很多討厭的問題。我記得lists.apple.com上的這篇文章:如何在OS X的主線程中使用GLUT?

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

在Mac OS X上,GLUT在這方面有什麼變化嗎?是否有線程安全的GLUT,讓你從任何線程打開窗口?

如果GLUT不是一個選項,有替換過剩和會從任何線程工作的一個小庫?

[編輯]

這裏是建議作爲答案通過各種解決方案觸發我的測試結果:

  • GLFW看上去不錯,但沒有編譯(當前分支是3歲)
  • Agar是另一個僞裝者,但它對於我的微小需求來說太大了
  • SDL不是BSD許可證兼容的,它是適合單個文件的大型代碼庫
  • GLUT無法在任何線程中運行。

我決定重新發明輪子(是的,有時候這很好),最後一堂課只有200行代碼。它讓我從任何線程打開和關閉一個窗口(openGL在新線程中繪製),並且我可以完全控制垂直同步等等(SDL對於OpenGL使用double buffering = slow)。我不得不欺騙NSApp以正確啓動和停止應用程序(否則不使用事件循環)。

對那些跟我說的OpenGL不是線程安全的,這是不完全正確:你可以同時運行多個線程的OpenGL和繪圖命令將分配給該線程OpenGL的狀態下執行。 OpenGL是線程專用

如果有人需要一些裸機代碼使用可可創建的OpenGL窗口:gl_window.mm

回答

3

GLUT不是線程安全的。您需要使用您選擇實施的任何解決方案鎖定原語。我建議在Cocoa中設置自己的GL視圖並重寫GLUT提供的管道。

看看SDL作爲現代GLUT更換。它應該給你所有你想要的跨平臺。就跨平臺線程而言,Boost提供便攜式library

+0

所有的代碼必須在Mac,Windows和Linux上運行。如果那裏有一名水管工,可以避免重寫一個過剩的水平,那會很好。 – gaspard 2010-01-29 20:12:21

+0

http://www.opengl3.org/resources/libraries/windowtoolkits/ – pestilence669 2010-01-29 20:32:39

2

至於GLUT的替代品,看看GLFW。它的目的和運作方式相似,但更好。它沒有一個glfwMainLoop,你的程序停滯不前;它可以讓你完全控制。自從我發現GLFW以來我一直不需要切換回GLUT。

請注意,GLFW是而不是線程安全,因爲從不同線程調用GLFW函數是不安全的(FAQ entry)。但是,只要你從同一個線程調用所有的GLFW函數,就可以選擇哪個線程。

+0

GLFW看起來不錯,但穩定的分支是3歲,它不會編譯(大量的棄用警告和錯誤)。 – gaspard 2010-02-05 15:09:26

+0

現在(如果不是在'10),一些重要的GLFW函數(如glfwCreateWindow)只能在OSX主線程中調用時由於OSX的限制而正常工作。 GLFW手冊記錄了哪些功能僅限於主線程。您仍然可以從其他線程調用它們,並且它可以在一些操作系統(例如Windows,Linux)上運行,但是不幸在OSX上運行。 – 2016-06-01 21:54:17

1

不僅是GLUT不是線程安全的,但OpenGL是一個狀態機,因此不是線程安全的。話雖如此,你可以擁有使用OpenGL的多線程應用程序。只要確保你所有的OpenGL調用都是由同一個線程構成的。

GLUT在Mac OS X上的下一步是Cocoa OpenGL Sample Code。這是一個真正的Cocoa應用程序,演示了使用Cocoa事件模型進行交互的Cocoa建立OpenGL窗口的方式。從這個起點開始,添加代碼可以很容易地在OpenGL繪圖代碼的單獨線程(或多個線程)中處理程序邏輯。

相關問題