7

短い質問:

Clojure の同時実行モデルでは、すべての LWJGL OpenGL Update 関数が同じスレッドから呼び出されるようにするにはどうすればよいですか?

長い質問

Leiningen/Clojure で lwjgl を使用した長く輝かしい戦いの後、LWJGL + Leiningen + Clojure が連携するようになりました。

ただし、LWJGL のドキュメントによると、OpenGL クライアント コマンドにはスレッド ローカル状態があるようです。別のスレッドから OpenGL コマンドを呼び出すと、Bad Things (TM) が発生する可能性があります。

したがって、私の質問: Clojure 内で Swing Threads のようなものをセットアップする正しい方法は何ですか (ただし、Swing Threads を使用できない/自分でセットアップする必要があります)。

(1) すべての OpenGL 呼び出しを担当する単一のメイン スレッドがあります。

(2) 他のスレッドがこのメイン スレッドと何らかの通信を行い、OpenGL 呼び出しを調整します。

私の背景

私は C/C++ でのスレッド化に精通しています。私は Clojure のエージェント/アトム/参照モデルに精通しています。ただし、Clojure での「手動」の同時実行/スレッド化については詳しくありません。

ありがとう!

4

1 に答える 1

5

これを設計する通常の方法は、すべてのレンダリングを単一のスレッドで処理することです。これにより、他のスレッドが「OpenGL 呼び出しを発行する」必要がなくなります。

もちろん、レンダリング スレッドに情報を取得する方法はまだ必要ですが、それは Clojure の標準的な同時実行技術で処理できます。たとえば、世界の状態が不変の場合、状態の更新にアトムを使用し、アトムに格納されている最新の世界の状態を使用してレンダリング スレッドにレンダリングを実行させることができます。

  (def world-state (atom (initial-world-state)))

  ;; in rendering thread
  .....
  (loop []
    (render-world @world-state) ; all OpenGL calls happen in this function!!
    (other-stuff)
    (if (still-running) (recur)))

  ;; in other thread responsible for updating world
  (loop []
    (swap! world-state update-world-function)
    (other-stuff)
    (sleep-if-needed)
    (if (still-running) (recur)))
于 2012-05-12T02:45:28.227 に答える