我想根據上一步更新地圖的每一步。我有一個裁判是一個向量的數字矢量,模糊我的世界地圖,我左,右,上下旋轉,然後平均我的四個新的世界地圖。我將這個更新作爲主循環中的「更改」來執行。它最初速度很快,但速度越來越慢。我不以某種我不知道的方式放棄頭部嗎?它似乎是每一步都進行所有以前的計算。這裏是我的代碼:Clojure在遊戲循環中引用狀態:爲什麼它變得越來越慢?
我定義地圖:
(def gradient-map
(ref(vec (repeat columns (vec (repeat rows 0))))))
這裏是我的更新功能:
(defn rotate-grid-up [grid]
(map #(concat (rest %) [(last %)]) grid))
(defn rotate-grid-down [grid]
(map #(concat [(first %)] (drop-last %)) grid))
(defn rotate-grid-right [grid]
(concat [(first grid)] (drop-last grid)))
(defn rotate-grid-left [grid]
(concat (rest grid) [(last grid)]))
(defn blur [grid]
(let [g1 (rotate-grid-up grid)
g2 (rotate-grid-down grid)
g3 (rotate-grid-left grid)
g4 (rotate-grid-right grid)]
(vec (map
(fn [r1 r2 r3 r4 r5]
(vec (map
#(/ (+ %1 %2 %3 %4 %5) 5)
r1 r2 r3 r4 r5)))
g1 g2 g3 g4 grid))))
然後在我的平局循環我模糊了各抽動
(dosync (alter gradient-map blur))
並且繪製循環緩慢爬行。
所有的旋轉函數都是懶惰的('map'和'concat'都是懶惰的)。也許你應該嘗試在['doall'](http://clojuredocs.org/clojure_core/clojure.core/doall)中包裝所有旋轉函數的主體,看看是否有幫助。 – DaoWen 2013-03-19 23:28:41
你確定這個'doasync'是混蛋嗎?你在抽獎循環中還做了些什麼? – Ankur 2013-03-20 04:26:06
你爲什麼使用參考?有多個線程?您是否以更快的速度創造作品? – 2013-03-20 11:18:04