2016-03-08 70 views
3

我對Clojure和LISP一般都很陌生,所以如果這個問題聽起來有點愚蠢,請事先諒解。我最近用MVC方式在Java中創建了一個基於回合的視頻遊戲,並且有一個線程負責圖形循環(因此,以固定的速率更新屏幕上圖形實體的幾何狀態),以及第二個線程負責處理遊戲的邏輯狀態;它的作用非常像守護進程:在後臺「休眠」,除非被要求做某些事情(精心設計的用戶輸入),然後向圖形線程傳遞「更改日誌」,以便它可以呈現對邏輯狀態所做的更改。所以遊戲世界根本就沒有「共享」:只有邏輯線程才能訪問它,而圖形線程的唯一職責是在初始化階段之後將變更應用於渲染,並且從邏輯線程到達新的更改日誌。在這種情況下,我應該如何處理Clojure中的可變狀態?

我讀到Clojure有變數,參考和原子。在這種情況下,我應該使用哪一個身份來將我的遊戲世界狀態存儲在Clojure的邏輯線程中?

+1

看看這篇文章,其中國家hais維護在clojure多線程生產者消費者流量http://stackoverflow.com/questions/8925371/clojure-producer-consumer –

回答

4

在你的情況下,不需要併發訪問,所以任何選項都是有效的。

ref是這個問題的過沖。在這種情況下通常不會使用var(通常,var rebinding用於可配置參數,而不是您的情況中的業務邏輯)。所以​​應該沒問題。

編輯:(上var闡述)

var,如^:dynamic(通常*earmuffed*)宣佈時,是本地線程。它可以有一個根綁定,並且每個線程可以將它重新綁定到一個新的線程本地值。因此,您可以在clojure代碼回購中看到var的典型用途,它們分別是*warn-on-reflection*,*unchecked-math*等。它們主要調整代碼的行爲。

因爲你只有一個線程對「董事會」數據的作品,這是OK使用var無論如何,但它看起來有點怪我。當看到var經常更改時,我變得有點不安。 :)

+0

嗨,謝謝你的回覆。你能詳細闡述一下主要用於可配置參數的變量嗎?另外,在處理可變性時,如果在同一資源上沒有併發訪問,你會不會總是建議使用原子? – pr0gma

+0

@ pr0gma我已經更新了答案。哦,對於額外的問題,我不會總是說。 Clojure 1.7在引入換能器時引入了一個新的構造'volatile!',它比'atom'更輕量級的構造,主要用於線程間不共享的「瞬態」可變數據。 – Davyzhu

+0

我不知道關於易變性!構建,它絕對看起來值得探究。再次感謝您花時間讓它更清晰! – pr0gma

相關問題