Rust de wasm de レイトレーシング

  • 7
    Like
  • 0
    Comment

東京から福岡に一時帰ってきたのですが、主に粉を固めたもの
(ラーメン・うどん・ピザ・梅ヶ枝餅など)しか食べてない気がします。

前にRustでWebAssemblyを実験したやつを書いたんですが、その後、いろいろと
RustでWebAssemblyでできるようになったっぽいので、また少し実験をしてみました。

環境

Chrome 57.0.〜
MacOSX 10.10.5 Yosemite
Rust 1.15.0

※ Rustでwasmを吐き出す方法については省略します。

実験と結果

よくある球に線を飛ばして、当たった場所の色を表示するやつです。
ソースコードについては、ここにおいておきます。

Rust内でレイトレーシングで数値を計算しておいて、Javascriptに計算結果を返して
canvas内に表示しています。

screenshot.png

少し詰まったところとしては、RustからJSに配列を返すときにVec(vec![])じゃなくて、
slice([])のポインタで返す必要があったんですが、vec.as_slice().as_ptr()では、
JSで受け取ったあとの配列内の数値がおかしい場合がありました。

なので、あらかじめ固定幅のsliceを作っておいて、clone_from_slice()でコピーして、
ポインタを返してあげました。
まあ、メモリー確保とかしていると考えると当たり前なのかな・・・?

感想

あまり凝ったことをしてないので、普通のJSと比べてWebAssemblyがすごく早いかどうかはわかりませんでした。
ただ、別言語をブラウザ内で実行できるのは便利かなと思います。(型チェックがあるし)

また、配列を受け渡ししたり、文字列を操作したりする場合は、
ポインタっぽい操作(Module._mallocとか)をしないといけないので、
そこら辺をゴニョゴニョできるRustとWebAssemblyは結構相性良いのかなーと思いました。