Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading LWJGL、Clojure、OpenGL命令的单线程 简短问题:_Multithreading_Concurrency_Clojure_Lwjgl - Fatal编程技术网

Multithreading LWJGL、Clojure、OpenGL命令的单线程 简短问题:

Multithreading LWJGL、Clojure、OpenGL命令的单线程 简短问题:,multithreading,concurrency,clojure,lwjgl,Multithreading,Concurrency,Clojure,Lwjgl,给定Clojure的并发模型,如何确保所有LWJGL OpenGL更新函数都是从同一线程调用的 长问题 经过一场漫长而光荣的战斗,我现在有了LWJGL+Leiningen+Clojure一起工作 然而,根据LWJGL文档,似乎有OpenGL客户端命令具有线程本地状态——如果我从不同的线程调用OpenGL命令,坏事情(TM)可能会发生 因此,我的问题是:在Clojure中,设置类似Swing线程(但我不能使用Swing线程/必须设置自己的线程)的正确方法是什么 (1) 只有一个主线程负责所有Ope

给定Clojure的并发模型,如何确保所有LWJGL OpenGL更新函数都是从同一线程调用的

长问题 经过一场漫长而光荣的战斗,我现在有了LWJGL+Leiningen+Clojure一起工作

然而,根据LWJGL文档,似乎有OpenGL客户端命令具有线程本地状态——如果我从不同的线程调用OpenGL命令,坏事情(TM)可能会发生

因此,我的问题是:在Clojure中,设置类似Swing线程(但我不能使用Swing线程/必须设置自己的线程)的正确方法是什么

(1) 只有一个主线程负责所有OpenGL调用

(2) 其他线程与该主线程进行某种类型的通信,以协调OpenGL调用

我的背景 我熟悉C/C++中的线程。我熟悉Clojure的agent/atom/ref模型。但是,我不熟悉Clojure中的“手动”并发/线程


谢谢

我通常的设计方法是让一个线程负责所有渲染。这样做可以避免其他线程“发出OpenGL调用”

当然,您仍然需要一种向呈现线程获取信息的方法,但这可以通过Clojure的标准并发技术来处理。例如,如果您的世界状态是不可变的,您可以只使用atom进行状态更新,并让渲染线程只使用存储在atom中的最新世界状态执行渲染:

  (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)))

在(其他内容)中,我应该调用(1)Thread.sleep还是(2)使用Java.util.Timer[它们是否在同一个线程中运行?]来获得60fps的渲染效果?我认为LWJGL有一个专门的工具:diplay.sync()。请参阅:。在那个链接上也有一些很好的示例代码。这正是我想要的。谢谢通过阅读LWJGL文档,我会发现这一点。:-)