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 が提供する配管を書き直すことをお勧めします。

最新の GLUT の代替としてSDLを見てみましょう。必要なすべてのクロスプラットフォームを提供する必要があります。クロスプラットフォームのスレッディングに関しては、Boost はポータブルライブラリを提供します。

于 2010-01-29T20:05:17.293 に答える
2

GLUT の代わりとして、GLFWを見てください。目的と仕組みは似ていますが、より優れています。glfwMainLoopそして、あなたのプログラムが立ち往生しているということはありません。完全に制御できます。GLFW を発見して以来、GLUT に戻す必要はありませんでした。

異なるスレッドから GLFW 関数を呼び出すことは安全ではないという意味で、GLFW はスレッドセーフではないことに注意してください( FAQ エントリ)。ただし、すべての GLFW 関数を同じスレッドから呼び出す限り、どのスレッドにするかは自由です。

于 2010-02-02T21:32:59.570 に答える
1

GLUTはスレッドセーフではないだけでなく、OpenGLはステートマシンであるため、スレッドセーフではありません。そうは言っても、OpenGLを使用するマルチスレッドアプリケーションを作成できます。すべてのOpenGL呼び出しが同じスレッドから行われていることを確認してください。

Mac OS XのGLUTからの次のステップは、CocoaOpenGLサンプルコードです。これは、Cocoaイベントモデルを使用した双方向性を備えた、OpenGLウィンドウを設定するCocoaの方法を示す真のCocoaアプリケーションです。この開始点から、OpenGL描画コードとは別のスレッド(または複数のスレッド)でプログラムロジックを処理するコードを追加するのはかなり簡単です。

于 2010-02-03T05:57:01.733 に答える