Clojure在状态的游戏循环中引用:为什么它变得越来越慢?

时间:2013-03-19 23:07:12

标签: clojure ref

我正在尝试根据上一步更新地图的每一步。我有一个参考数字矢量的矢量和模糊我的世界地图我左,右,上,下旋转,然后平均我的四个新的世界地图。我将此更新作为主循环中的“更改”。它最初很快但速度越来越慢。我不是以某种我不知道的方式放开头脑的吗?似乎它在每一步都进行了所有先前的计算。这是我的代码:

我定义地图:

      (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))

并且绘制循环减慢为爬行。

2 个答案:

答案 0 :(得分:0)

代码创建的向量太多,导致内存使用和gc增加。

你可以尝试不创建矢量,懒洋洋地做任何事情,或者你可以尽量减少他们的创作。或者,您可以改为使用矩阵库(例如core.matrix或Incanter)。

另外,无关,你需要一个参考游戏状态的参考吗?如果与其他这样的东西没有依赖关系,原子就足够了吗?

答案 1 :(得分:0)

在我相当新的计算机上,对于1000x1000网格,模糊需要大约2.7秒。你的世界地图会不断增长?