パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

バイトボードを使ってみる

2016-05-03 | プチコン3、4、BIG
C++でビットボードとか使ってみようと思っているのですが、インターフェースが決まらない
オセロからやってみたいのですが、駒なりとかのコーディングのイメージがあんまりつかめていない。
とういうことで勉強がてらプチコン3号を使って一番簡単そうなライフゲームをバイトボードで作ってみました。
2号の公開キー『D3S8NJRX』


1号

最初に作ったのはドットの一つ周りに何点生きがあるか判定、
バイトボードの生きている点を8方向にずらして重ねるという方法で計算

周りに3点あればいずれにせよ点を設定、
周りに2点あって現在生きている点なら設定

これをぐるぐる回して計算

普通ライフゲームで負荷が高いのは周りのドット計算なのですが
今回は点の設定判断のほうが8倍ぐらい遅い

当初一世代6秒位だったのをチューニングして2秒
配列個々へのアクセスが時間をとっていました。

ここで終わる予定だったのですが

なんとかこの判断もバイトボードでできないかと思ったのですが配列のANDがないからあきらめてました。





2号

ARYOPの演算で#AOPCLPという演算タイプを使って数値の上下判定ができるようになったので

次世代の生存点をAPYOPだけで計算できるようになりました。

これでもスピードは大幅アップ4割ぐらいあがりました。

あと問題は最後に生存点を画面に落とすところここに着手します。
生存点をバイトボードの1で表しているのでこれに色コードを掛け合わせるとGLOADで使えるデータ形式になります。

バイトボードの上下左右には余白を1ドットずるもたせていてその余白を外したデータを作ってGLOADで一括配置

色コードの掛け合わせも単色じゃなくて少しばらした値の配列を作ってARYOPで掛け合わせました。

まさか初期3DSで400x240のライフゲーム0.8秒で一世代計算して表示できるとは!

ソースを見直してみてIF文がまったくなくなっているのに驚きました。
初期データの作成部で使っていますがなくすことはできます。
for文もメインの次世代計算で使っていません。

ひょっとして分散コンピューティング向きのコーディングこんなのかも


頭の中だけではバイトの論理演算ミスが多くて何度も図を書き直しました。
IF THENといった流れのあるコーディングと違っていて難しかったです。

ライフゲーム作成で一番頭使いました。

プチコン3号史上なら最速かな?




--------------------------------------------
5/4追記
さらに4倍以上速いプログラムが登場しました。ソースもみたのですが難しい!!
半日天下でした^^

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。