wasm で簡単な物理シミュレーションを書いてみた話
対象
C/C++ wasm 初学者
内容
Wasm で簡単な粒子のシミュレーションを書いてみた時の覚え書きを幾つか。
出来たものはこちら。
- 私の古いノートPC 上でローカルだと 50k 粒子/60fps 弱くらい。wasm だと3割くらい性能が落ちて 40fps ちょい。
- テストする度にファンがウィンウィン鳴るのが煩いので、ページに載せているのは 20k 粒子に落としたもの。
- ブラウザでの描画は 60fps で決まっていると聞いたので、SDL_SetRenderVSync() で 60fps 上限に固定。
- インプリは、SDL3(2D)、C++、emscripten。これを React で包んだ。
- canvas の大きさは 600px 四方で固定。イベントのやり取り等はなし。
- wasm 化をする時の、emscripten のコンパイルオプションは、上のページに書いてあるとおり。そこそこ苦戦した。
- 粒子衝突シミュレーションの方は、衝突判定をグリッドと SoA 、メモリの並び替え、スレッドを使用して高速化。
- SDLでの描画は、SDLRenderPoints()を使った点でしかない。 全ての粒子の位置を SDL3 に一度に渡して描画してるだけ。
手元の環境だとWebGPU が使えないので、ここから数倍の効率化とかは難しいかもなぁと思い、50k/60fps 弱辺りで断念。衝突判定に4分木とか使うともっと速くなるのかも。
参考ページ: