2006-04-15-01-PalmLife にまつわるあれこれ - project-enigma

2006-04-15-01-PalmLife にまつわるあれこれ

>> Site top >> weblog >> 月別アーカイブ >> 2006年04月のlog >> 2006-04-15-01-PalmLife にまつわるあれこれ

最終更新日付:2013/12/31 07:39:28


PalmLife にまつわるあれこれ

2006 年 04 月 15 日

全開で開発(の前のデザイン)実施期間中の陰郎です。頭の中はそんな次回作への思いでいっぱいなわけですが、今それをここでブチまけるワケにはまいりません。そうなると極端に書くことがなくなってしまうので、苦し紛れの策に出ます。先日 version 0.95 beta をリリースした、大方の予想通りイマイチ反応の薄い PalmLife ですが、あのアプリの実装上のあれこれについて書いてみようかと。おそらくアプリ自体よりも消化の悪い文章になってしまうでしょうが、そこはそれ、一応 project-enigma はソフトウェア開発のサイトですからね。1人で張り切ってまいる所存であります。では、いってみましょうか。

さて、うねうねぐりぐりと動く気味の悪い PalmLife ではありますが、内部でやっていることは恐ろしく単純です。もう、8割方配列の参照だけと言い切ってしまって良いほど。もちろん性能の向上のために意図的にやっています。なんせ、160 x 130 のグリッドでは1世代を計算するだけで 187,200 回のセル参照が発生するのです。できる限り高速に動作するような実装を心がけねばなりません。

今回は、余計なロジックを排除するためにした工夫を1つ紹介しましょう。スペース上の都合と説明のため、7 x 9 の小さなグリッドを考えます。愚直な実装をすると、長さ63 のセル配列を用意することになるでしょう。そして、それをグリッド幅で折り返すように扱うと、以下のような感じになります。

で、とあるセルの隣接セルを参照することを考えます。たとえば、8番目のセルの隣接セルは 0, 1, 2, 7, 9, 14, 15, 16 番目のセルです。同様にほとんどのセルは自分のインデックスの -8, -7, -6, -1, +1, +6, +7, +8 番目を間接参照することで隣接セルを得ることができます...ほとんど? そう、「外周のセル」以外は。

上の表で、グリッドの外周にあるセルで同じ方法で間接参照をするとマズいことになるのはすぐに分かるでしょう。外周のセルだけは別扱いで処理せねばならないわけです。なぜなら、PalmLife では境界には Torus と Island の2種類があり、端っこの向こうは反対側だったり常に状態0のセルだったりするわけです。そういうあれこれをきちんと考慮しないといけない。それはつまり、余計なロジックが入り込むということ。これはなんとかせねばなりません。結構な量の計算をするときには、ちょっとしたロジックでも性能に影響を与えることになりますからね。

で、それを(すくなくとも陰郎が考える限り)すっきり実装するためにやっているのが以下のような実装です。セルグリッドの上下左右にそれぞれ1行1列分よけいに用意してやり、その数で配列を用意します。

なんだか面倒臭そうに見えるかもしれませんが、実際はそうでもありません。キモは、次世代を計算する直前に「外野のセル」を反対側の外周セルのコピーにすること。たとえば、9番目のセルには16番目のセルの内容がコピーされます。1番は82番のコピー。そして98番は10番のコピーです。こうしておけば、各セルの隣接セルは全て同じ間接参照でイケるようになります。この場合なら -10, -9, -8, -1, +1, +8, +9, +10 番目の間接参照になりますね。

おっと、外野にコピーするのは境界が Torus だった場合の話です。境界が Island の場合は、「 外野のセル 」 はすべてセル状態が0で維持されます。ま、いずれの境界スタイルでもこのやり方でOK...なワケですね。

実際問題として、「それでどれくらい速くなったの?」と質問されると困るんですけどね。実は比較していないので。(笑  まぁそれなりに速くなったように記憶していますが、なにせ ARM ネイティブコード対応をするまでは速度的に満足できなかったワケですから、無駄なあがきといえばそれまでだったのかもしれません。他にもいくつか書こうと思っているのですが、今回はこのあたりで。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.