回転速度比較(微違)

 DirectX「回転」を扱うものの処理速度を比較しましょうのコーナーです。

(いつからコーナーになった!?)



 ※例によって何となくザックリと適当に計っているので参考程度でお願いいたします。



 というわけで、今回はQuaternionとMatrixの比較を。

今回は

DWORD et = timeGetTime();

for( int i=0 ; i<100000 ; i++ )
{
    // ここに比較する式を書く
}

WriteDebug( "elapsed : %d", timeGetTime() -et );

こんな感じのソースの出力から所要時間を判断します。

(要するに、対象を100000回ループさせた時間から判断するということ)





・Matrix

 まずは一般的な行列による回転方法。

// tempはループ外部で宣言のみ。
// r : パラメータ。回転量
D3DXMatrixRotationY( &temp, r );

Y軸でグルグルします。

で、この結果が「9〜14」、大体平均して11msくらいかな?



・Quaternion

 お次は四元数

// 初期化
quat.x = quat.y = quat.z = 0.0f;
quat.w = 1.0f;
// axisを軸としてrだけ回転させる
// axis : 軸のベクトル。
// r : パラメータ。回転量
D3DXQuaternionRotationAxis( &quat, &axis, r );

// quatを行列に変換してg_quatに格納
D3DXMatrixRotationQuaternion( &g_quat, &quat );

axisでグルグルします。

行列に変換しないと座標変換に放り込めないので、仕方なくx2で1set。

これが「20〜30」。大体平均23msくらい?

(ちなみに、D3DXQuaternionRotationAxis()のみだと、「10〜15」で平均12msくらい)





と、いうわけで、(実際に使う際の)処理速度的には「Matrix > Quaternion」みたいです。

変換で関数を余計にかます必要があるのが痛いか。

(逆に考えると、変換とタイミングを考えてやれば使えなくはないというところか)





・おまけ

座標変換に欠かせないものの負荷も調べてみる

行列の積算。

// set_w・temp : 共にD3DXMATRIX型とする。
set_w *= temp;

これが、「8〜15」の12msくらい。



続いて、ワールド行列取得。

// set_w : 上記と同義
デバイス->GetTransform( D3DTS_WORLD, &set_w );

これも、「8〜15」の12msくらい。



最後に、ワールド行列設定。

// set_w : 上記と同義
デバイス->SetTransform( D3DTS_WORLD, &set_w );

これも、「25〜38」の30msくらい(!)





 行列設定が思いの外重いことに注意したいところ。