WebAssembly(Rust)の実行速度を簡単な球の物理計算で性能テストしてみました。あと以前作成したゲームループに問題があったため、処理落ちしても大丈夫なように修正、改良しました。
少し古いPC(Windows10)で30FPSを維持できる個数は、Chromeで5000個、Firefox4500個、Edge2500個でした。低価格スマホ、タブレット(android、Chrome)では1000個。
カテゴリー: 計算
計算、物理シミュなどのプログラミング
位置を共有している頂点のマージアルゴリズム
投稿日:3Dモデルデータの最適化のために、ほぼ同じ位置にある頂点データを1つにまとめる(マージする)処理を作成します。総当たりで近い位置にあるか比較していけば簡単に実装できると思っていました……
これまでの経験では数千頂点程度のマージ処理だったので、それほど実行速度を気にすることはありませんでした。が、今回約70000頂点のマージを総当たり比較で処理したところ、処理時間1分間以上。違う方法を考えなければ。
DirectXMathメモ 行列からオイラー角など
投稿日:行列のかける順序やオイラー角への変換など、よく使う行列計算のメモ書き。
法線ベクトルの生成とスムージング
投稿日:次は光源計算にいきたいところですが、メタセコイアのデータには法線ベクトルが含まれないためポリゴン形状から法線ベクトルを計算で求め、スムージングを行います。
メタセコイア以外の法線ベクトルが出力されるモデリングツールを使えばいいのですが、今後必要になるかもしれなので計算処理を作っておきます。
DirectXMath
投稿日:DirectX11のプログラムができるようになったので、次は3Dグラフィックスの表示といきたいところですが、その前に3DCGで必要になるベクトルや行列の計算を行うライブラリを準備します。
DirextX9や10に含まれる計算関数、XNAMath(マイクロソフトが提供するゲーム作成環境XNAの計算ライブラリ)などを使う予定でしたが、DirectXMathという計算ライブラリがあるようなので、これを使うことにしました。
DirectXMath Programming Guide (Windows)を参考に。
DirectXMath (Windows)からだと日本語のページがなくXNAMathのページへ、仕方なく英語で。
DirectXMathの特徴
・DirextX9、10、XNAMathに代わる計算ライブラリ
・インライン定義のみ(ヘッダファイルのみリンクなし)
・SSE/SSE2やARM-NEONなどのCPU命令を使用(ベクトル計算を高速に)
・CPU毎に実行ファイルを用意する必要がある(インライン定義なので)
最後が少し気になるけど、SSE/SSE2対応CPUに限定してプログラミングするので問題なし。
DirectXMath.hは現在インストールしているWindowsSDKに含まれているので、使用するにはDirectXMath.hをincludeするのみ。
検証用ソースコード(CPU判定と意味のない計算をするだけ)
#include
if(DirectX::XMVerifyCPUSupport()){
using DirectX::XMVECTOR;
using DirectX::XMMATRIX;
XMVECTOR v0 = DirectX::XMVectorReplicate(0.0f);//v0=(0,0,0,0)
XMVECTOR v1 = DirectX::XMVectorSet(1.0f,2.0f,3.0f,1.0f);//v1=(1,2,3,1)
XMMATRIX m0 = DirectX::XMMatrixIdentity();
XMMATRIX m1 = DirectX::XMMatrixScaling(1.0f,2.0f,3.0f);
XMMATRIX m = DirectX::XMMatrixMultiply(m0,m1);
XMVECTOR v = DirectX::XMVector4Transform(v1,m);
float vx = DirectX::XMVectorGetX(v);
float vy = DirectX::XMVectorGetY(v);
float vz = DirectX::XMVectorGetZ(v);
MessageBox(NULL, L"DirectXMath対応CPU", L"DirectXMath", MB_OK);
}
まず最初に、DirectX::XMVerifyCPUSupport()でCPUが対応しているか調べ、未対応の場合プログラムを実行できないので、強制終了などのエラー処理が必要なります。XMVerifyCPUSupportを使用するときは、DirectXMath.hのincludeの前にwindows.hをincludeする必要があります。
あとはDirectXMath Programming Guide (Windows)を参考にベクトルや行列の計算を試してみました。デバッガでの確認ですが計算は正しく行われているようです。
これで計算ライブラリの準備完了。
使い方は必要に応じて調べていきます。
DirectXMath (Windows)
DirectXMath Programming Guide (Windows)