Multithreading LWJGL、Clojure、OpenGL命令的单线程 简短问题:
给定Clojure的并发模型,如何确保所有LWJGL OpenGL更新函数都是从同一线程调用的 长问题 经过一场漫长而光荣的战斗,我现在有了LWJGL+Leiningen+Clojure一起工作 然而,根据LWJGL文档,似乎有OpenGL客户端命令具有线程本地状态——如果我从不同的线程调用OpenGL命令,坏事情(TM)可能会发生 因此,我的问题是:在Clojure中,设置类似Swing线程(但我不能使用Swing线程/必须设置自己的线程)的正确方法是什么 (1) 只有一个主线程负责所有OpenGL调用 (2) 其他线程与该主线程进行某种类型的通信,以协调OpenGL调用 我的背景 我熟悉C/C++中的线程。我熟悉Clojure的agent/atom/ref模型。但是,我不熟悉Clojure中的“手动”并发/线程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
谢谢 我通常的设计方法是让一个线程负责所有渲染。这样做可以避免其他线程“发出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文档,我会发现这一点。:-)