東京から福岡に一時帰ってきたのですが、主に粉を固めたもの
(ラーメン・うどん・ピザ・梅ヶ枝餅など)しか食べてない気がします。
前にRustでWebAssemblyを実験したやつを書いたんですが、その後、いろいろと
RustでWebAssemblyでできるようになったっぽいので、また少し実験をしてみました。
環境
Chrome 57.0.〜
MacOSX 10.10.5 Yosemite
Rust 1.15.0
※ Rustでwasmを吐き出す方法については省略します。
実験と結果
よくある球に線を飛ばして、当たった場所の色を表示するやつです。
ソースコードについては、ここにおいておきます。
Rust内でレイトレーシングで数値を計算しておいて、Javascriptに計算結果を返して
canvas内に表示しています。
少し詰まったところとしては、RustからJSに配列を返すときにVec(vec![])じゃなくて、
slice([])のポインタで返す必要があったんですが、vec.as_slice().as_ptr()
では、
JSで受け取ったあとの配列内の数値がおかしい場合がありました。
なので、あらかじめ固定幅のsliceを作っておいて、clone_from_slice()
でコピーして、
ポインタを返してあげました。
まあ、メモリー確保とかしていると考えると当たり前なのかな・・・?
感想
あまり凝ったことをしてないので、普通のJSと比べてWebAssemblyがすごく早いかどうかはわかりませんでした。
ただ、別言語をブラウザ内で実行できるのは便利かなと思います。(型チェックがあるし)
また、配列を受け渡ししたり、文字列を操作したりする場合は、
ポインタっぽい操作(Module._mallocとか)をしないといけないので、
そこら辺をゴニョゴニョできるRustとWebAssemblyは結構相性良いのかなーと思いました。