我想知道是否有任何普遍的计时器解决方案。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