JavaScriptでライフゲームを高速化(その2)

ライフゲーム(軽量版2)

前回は1つのセルに3bitを割り当て、32bit変数で10個のセルを並列処理した。
3bitに縮めて工夫したつもりになっていたら、実はもっといい方法があった。

ビットボード(Bitboard)を用いたライフゲームのソースコード - Tosikの雑記
この記事はライフゲームで検索するときに出てくるので、以前から知ってはいた。
しかし、何をしているのか理解できなかったからか、
自分のMMXライフゲームの圧倒的な速さ(VB版と比べて(笑))に感動した余韻があったからか、
実際に理解をしてコードを書いたのは今回が初めてとなる。

これは1セルを1bitに格納するという究極的な方法だ。
どうやって足し算をするのかと思ったら、和のパターンを全てビットボードで持つのだ。
例えば、和が4になるのは、4に0を足した場合と、3に1を足した場合だけだ。
(1bit値を足すときの話なので、0か1しかない)
lifelite2.htmlのソースでは87〜128行辺りで使っている。

全体としては2割程度の高速化だが、描画処理を除くと2倍の速さを得ている。
これならMMXでも使えそうだ。ビット演算しか使わないのが素晴らしい。
もっとも、ライフゲームの場合はデータの準備に1bitシフトが必要なのが厄介だ。