【问题标题】:LWJGL, Clojure, Single Thread for OpenGL CommandsLWJGL、Clojure、OpenGL 命令的单线程
【发布时间】:2012-05-20 14:14:29
【问题描述】:

小问题:

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

长问题

经过漫长而光荣的战斗,Using lwjgl in Leiningen/Clojure,我现在有 LWJGL + Leiningen + Clojure 一起工作。

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

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

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

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

我的背景

我熟悉 C/C++ 中的线程。我熟悉 Clojure 的代理/原子/参考模型。但是,我不熟悉 Clojure 中的“手动”并发/线程。

谢谢!

【问题讨论】:

    标签: multithreading concurrency clojure lwjgl


    【解决方案1】:

    我设计它的通常方式是让一个线程负责所有渲染。通过这样做,您可以避免其他线程“发出 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)))
    

    【讨论】:

    • 在(其他)中,我应该调用 (1) Thread.sleep 还是 (2) 使用 Java.util.Timer [这些在同一个线程中运行吗?] 以维持 60fps渲染?
    • 我认为 LWJGL 有一个特殊的工具:Diaplay.sync()。请参阅:ninjacave.com/lwjglbasics4。该链接上也有一些很好的示例代码。
    • 正是我想要的。谢谢。通过阅读 LWJGL 文档,我会发现一点。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多