我想知道是否有任何普遍的計時器解決方案。clojure中的計時器?
我想通過交易來寫一個簡單的遊戲引擎,將處理用戶輸入上打勾每20ms(或之後 20毫秒(或任何其他時期進行一次一些動作)),基本上更新「全球性」的狀態,同時也我打算使用futures
,所以這個解決方案應該能夠處理併發警告。
你能給我一個建議嗎?
我想知道是否有任何普遍的計時器解決方案。clojure中的計時器?
我想通過交易來寫一個簡單的遊戲引擎,將處理用戶輸入上打勾每20ms(或之後 20毫秒(或任何其他時期進行一次一些動作)),基本上更新「全球性」的狀態,同時也我打算使用futures
,所以這個解決方案應該能夠處理併發警告。
你能給我一個建議嗎?
你實際上已經得到了兩個不同的問題在這裏。
首先是定時器問題。你有很多的選擇,在這裏:
(future (loop [] (do-something) (Thread/sleep 20) (when (game-still-running) (recur))))
我可能只是使用簡單的線程選項 - 它很容易設置和容易在以後如果你需要破解更多的功能。
第二個問題是操控遊戲狀態。這實際上是棘手的問題,你就需要設計它圍繞特定類型的你正在遊戲的,所以我就提出建議的幾點:
該解決方案假設你在JVM上寫的Clojure。 像這樣的東西可以工作:
(import '(java.util TimerTask Timer))
(let [task (proxy [TimerTask] []
(run [] (println "Here we go!")))]
(. (new Timer) (schedule task (long 20))))
也相關和有趣http://pragprog.com/magazines/2011-07/create-unix-services-with-clojure – 2013-05-05 13:38:35
謝謝,最後我得到了我的'滴答'消息出現:) – asdf 2013-05-05 13:46:51
@dig,JVM考慮使用'ScheduledExecutorService':http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html。計時器有幾個缺點,執行者服務沒有。 – 2013-05-05 14:08:58
現在我會考慮的核心/異步是一個不錯的選擇,因爲
這裏是草圖
(require '[clojure.core.async :refer [go-loop]])
(go-loop []
(do
(do-something ...)
(Thread/sleep 1000)
(recur))))
使用'(<!(timeout 2000))'代替'Thread/sleep'並引用'<!'和' timeout' – 2016-12-07 13:13:13
謝謝,我同意遊戲很難,我的計劃體系結構使用clojure功能的路徑只開始:) – asdf 2013-05-05 13:56:11