あいさつ
どうも、はかせです。
今回はFPS改善のために色々やった話です。
行列計算の削減
とりあえず何がボトルネックになってるのか
処理時間計測したところ描画のための行列計算と、
実際の描画がそれぞれ7~8msぐらいかかっていました。
なので描画のための行列計算削減をしてみました。
具体的な理屈とかは下記のサイトで
ameblo.jp
そしてこのサイトにならって書いたコードです。
XMMATRIX DXCamera::GetDXCameraParam(TRANSFORM* transform)
{
//x軸中心回転
XMMATRIX worldX = XMMatrixRotationX(ToRadian(transform->Rotation.y));
//y軸中心回転
XMMATRIX worldY = XMMatrixRotationY(ToRadian(transform->Rotation.x));
//z軸中心回転
XMMATRIX worldZ = XMMatrixRotationZ(ToRadian(transform->Rotation.z));
//移動計算
XMMATRIX move = XMMatrixTranslation(transform->Position.x,transform->Position.y,transform->Position.z);
//スケール計算
XMMATRIX scale = XMMatrixScalingFromVector(XMVectorSet(transform->Scale.x, transform->Scale.y, transform->Scale.z, 0.0f));
DirectX::XMMATRIX matrix = worldX * worldY * worldZ;
matrix.r[0].m128_f32[0] *= transform->Scale.x;
matrix.r[0].m128_f32[1] *= transform->Scale.x;
matrix.r[0].m128_f32[2] *= transform->Scale.x;
matrix.r[0].m128_f32[3] = 0.0f;
matrix.r[1].m128_f32[0] *= transform->Scale.y;
matrix.r[1].m128_f32[1] *= transform->Scale.y;
matrix.r[1].m128_f32[2] *= transform->Scale.y;
matrix.r[1].m128_f32[3] = 0.0f;
matrix.r[2].m128_f32[0] *= transform->Scale.z;
matrix.r[2].m128_f32[1] *= transform->Scale.z;
matrix.r[2].m128_f32[2] *= transform->Scale.z;
matrix.r[2].m128_f32[3] = 0.0f;
matrix.r[3].m128_f32[0] = transform->Position.x;
matrix.r[3].m128_f32[1] = transform->Position.y;
matrix.r[3].m128_f32[2] = transform->Position.z;
matrix.r[3].m128_f32[3] = 1.0f;
//転置行列を計算
return XMMatrixTranspose(matrix * mView * mProj);
}
要は行列を素直に計算した結果を見たところ、
差分がそんなになかったから差分のとこだけピンポイントで計算して
計算量減らそうってやつですね。
変更の少ない変数のメンバ化
毎フレーム実行されるけどそんなに結果が変わらないものを
メンバ変数に上げて処理量を減らそうという取り組みです。
(カメラのview行列やproj行列とか)
結果
さて色々な微調整を行った上での実行結果です。

ショボ━(´・ω・`)━ン
ちなみに
一応ダメもとでReleaseビルドでもやってみました。

( 'ω' )ファッ!?