2013-03-19 63 views
1

我想根據上一步更新地圖的每一步。我有一個裁判是一個向量的數字矢量,模糊我的世界地圖,我左,右,上下旋轉,然後平均我的四個新的世界地圖。我將這個更新作爲主循環中的「更改」來執行。它最初速度很快,但速度越來越慢。我不以某種我不知道的方式放棄頭部嗎?它似乎是每一步都進行所有以前的計算。這裏是我的代碼: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)) 

並且繪製循環緩慢爬行。

+0

所有的旋轉函數都是懶惰的('map'和'concat'都是懶惰的)。也許你應該嘗試在['doall'](http://clojuredocs.org/clojure_core/clojure.core/doall)中包裝所有旋轉函數的主體,看看是否有幫助。 – DaoWen 2013-03-19 23:28:41

+1

你確定這個'doasync'是混蛋嗎?你在抽獎循環中還做了些什麼? – Ankur 2013-03-20 04:26:06

+1

你爲什麼使用參考?有多個線程?您是否以更快的速度創造作品? – 2013-03-20 11:18:04

回答

0

該代碼創建了太多的矢量,導致內存使用量和gc增加。

你可以嘗試不創建矢量,懶洋洋地做所有事情,或者你可以儘量減少創建。或者,您可以改爲使用矩陣庫(例如,core.matrix或Incanter)。

另外,無關,你需要一個遊戲狀態的參考?如果沒有與其他類似的東西存在依賴關係,那麼原子就足夠了?

0

在我相當新的計算機模糊情況下,1000x1000網格需要大約2.7秒。你的世界地圖是否會隨着時間而增長?