てけもぐ Tech 忘備録

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分木とか使うともっと速くなるのかも。

参考ページ: