1

前のステップに基づいて、各ステップでマップを更新しようとしています。数値のベクトルのベクトルである参照があり、世界地図をぼかすために、左、右、上、下に回転させてから、4 つの新しい世界地図を平均します。この更新は、メイン ループの「変更」として行います。最初は速いですが、どんどん遅くなります。知らないうちに頭を手放していませんか?各ステップで以前のすべての計算を行っているようです。これが私のコードです:

マップを定義します。

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

描画ループはクロールに遅くなります。

4

2 に答える 2

0

私のかなり新しいコンピューターでは、1000x1000 グリッドでぼかしに約 2.7 秒かかります。あなたの世界地図は時間の経過とともに拡大していますか?

于 2013-03-20T13:41:30.860 に答える
0

コードが作成するベクトルが多すぎるため、メモリ使用量と gc が増加します。

ベクターを作成しないようにするか、すべてを怠惰に行うか、ベクターの作成を最小限に抑えることができます。または、代わりにマトリックス ライブラリ (core.matrix や Incanter など) を使用することもできます。

また、無関係ですが、ゲームの状態の参照が必要ですか? 他のそのようなものとの依存関係がなければ、確かにアトムで十分でしょうか?

于 2013-03-20T05:07:13.610 に答える