LWJGL,Clojure,OpenGL命令的单线程

use*_*359 6 concurrency multithreading clojure lwjgl

简短问题:

鉴于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的agent/atom/ref模型.但是,我不熟悉Clojure中的"手动"并发/线程.

谢谢!

mik*_*era 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)))
Run Code Online (Sandbox Code Playgroud)