ルービックキューブをWebGLで描画する

Rubik's Cubeの解法研究のためにソフトウェアを開発する

の進捗報告をする。

星ください。Rubik Master (Github)

描画

ルービックキューブが回るようになった。 Yewコンポーネントだ。WASMとWebGL2で動いている。

YewはReactのようなものだ。どういう設計にしようかと悩んだ結果、とりあえずはプロパティに「初期状態」と「コマンド列」を渡すと そのとおりにアニメーションしてくれるようにした。将来的にはプロパティだけでなく、動的にコマンドを突っ込むチャネルのようなものも提供するつもりで、 そうすると、例えば思念や指の動きによってルービックキューブを動かすことが出来るようになるだろう。

Rustによる開発は非常に安全だ。ほとんどバグらない。 だからむちゃくちゃ早く開発出来る。 Rustを使えば、 守るべきところを型で守ってあげることによって、コンパイラがバグを見つけやすく出来る。 しかしこれには実際のところ、技術がいる。何の技術もなくてもRustを使えばそれなりに品質の高いソフトウェアが作れるが、 Rustの力を完全に引き出すためにはそれなりの経験がいる。 設計自体もクリーンに保つ必要がある。

ただし、WebGLはバグった。 まず、フラグメントシェーダーのコンパイルが通らないと言っているが、 具体的にどこが悪いのかさっぱりわからない。 どうにかシェーダーのコンパイルは通ったが、 今度はピース一つ映すことすら出来ない。 おれのピースはどこ行ったん? こんな感じで何時間かは苦しんだ。

WebGLに関しては、 おれは可視化の研究室出身なので、 実際にOpenGLを使う研究をしていたわけではないため OpenGLを書いたことはなかったが、 話で聞いて仕組み自体は知っていた。なので、理解は簡単だった。

一応本はざっと読んだ。基本的に何か新しいことをする時はまとまった本を一気に読んでしまうのがコツだ。 ざっとでも一旦全体像を知ってしまう方が、理解が早くなる。 本はオワコンという人がいるが、まとまった知識を素早く取り入れる目的には優れている。

解法探索

解法探索プロジェクトは、 13の記号を使って長さ10のOLLを見つけて(これは100万個くらい見つかる)、 この2つを組み合わせることによって 18/21のPLLを発見する成果を得たが、実用性が見えず、それ以降進めてない。

解法探索では、計算の高速化が求められる。 そのために行列演算の高速化、Rayonを使った並列化などをした。 その結果、シングルコアでも、1回の掛け算が1usくらいで出来るようにはなった。 性能向上の叩き台になっただけでも、意味はあったかな。

ルービックキューブの状態と、回転は54x54のpermutation matrixで表現されている。 掛け算は実際には長さ54の配列のギャザーとなっている。 そこで素直な発想として、さらなる高速化のためSIMDを使った高速化をやりたかったが、 AVX2では要素数が32までしか許されないため無理だった。 もし長さを32まで減らすことが出来たら奇跡が起きるのだが。天才はおらんか?

パーサ

その他の進捗としては、回転記号のパーサを書いた。 これはnomというパーサコンビネータを使った。 これに関しては、文法をそのままコードに落とせば良いだけなので数時間で出来た。 パーサコンビネータはやばすぎる。

今後

描画はまだ非最適なところが多く、故に少しカクつきがある。 また、マウス操作でカメラを動かすことなども出来ない。これはさすがに出来た方が良いだろう。

というわけで多少やることはあるが、ルービックキューブのソフトウェア開発については一段落というところだ。 とにかく、おれの中から沸いてくるアスペに身を任せてめちゃくちゃ開発した。 生活リズムはめちゃくちゃだし、昨日も寝たのは朝の4時だ。 しかしどうにか一段落ついた。

次はリアルキューブでソルブ30秒を目指す。 おれは麻布高校卒だ。出来るに決まってる。