LoginSignup
10
3

More than 5 years have passed since last update.

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

Posted at

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

前に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は結構相性良いのかなーと思いました。

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3