2012-04-24 568 views
3

新しいXMVECTORとXMFLOAT3クラスを使用すると、2点間の距離を得る最も良い方法は何ですか?DirectXMathで2点間の距離を取得する最適な方法は何ですか

float distance(const XMFLOAT3& v1,const XMFLOAT3& v2) 
{ 
    XMVECTOR vector1 = XMLoadFloat3(&v1); 
    XMVECTOR vector2 = XMLoadFloat3(&v2); 
    XMVECTOR vectorSub = XMVectorSubtract(vector1,vector2); 
    XMVECTOR length = XMVector3Length(vectorSub); 

    float distance = 0.0f; 
    XMStoreFloat(&distance,length); 
    return distance; 
} 

が、これはX、Y、Zのためのちょうど3フロートと、通常のVector3クラスよりも高速になります:私はので、私は、次のを思い付いた機能のXMVector *ファミリーでそれをしない機能を見つけることができませんでしたそれが本質的な最適化を使用するのでsqrtを使用していますか?すなわち:

float Distance(const Vector3& point1,const Vector3& point2) 
{ 
    float distance = sqrt((point1.x - point2.x) * (point1.x - point2.x) + 
          (point1.y - point2.y) * (point1.y - point2.y) + 
          (point1.z - point2.z) * (point1.z - point2.z)); 
    return distance; 
} 

答えて

5

ポイント間の距離を取得する方法は1つだけです。それがあなたが描いた方法です。それは固有の最適化を使用するためvec3 diff = b - a; float distance = sqrtf(dot(diff, diff));

これはX、Y、Z、次いでSQRTを使用するためのわずか3フロートと通常のVector3クラスより速いだろうか?

パフォーマンスが心配な人は、速いものを推測するのではなく、アプリケーションのプロファイルを作成する必要があります。 「効率の悪い」ソリューションの影響がアプリケーションでは完全に気付かれない可能性は非常に高いです。

あなた自身でルーチンを書き始めると、効率が悪くなるか、バグが発生する可能性が非常に高いです。例えば、 "手書き"のコードは、 "XMVECTOR"を使用する元のコードよりも浮動小数点の計算を(コンパイラに依存して)実行することができます。あなたのルーチンでは、ベクトルの差を2回計算します。コンパイラがそれを最適化しないと、の減算、2つの加算、1つのsqrtf、および3つの乗算で終わるでしょう。 "XMVECTOR"コードでは、減算、2加算、3乗算、1 sqrtfを使用します。

プロファイリングアプリケーションの場合は、AQTime 7 Standard(現在は無料)またはgprof(gcc/g ++でコンパイルしている場合)を使用できます。

3

D3DXVec3Length(&(Point1-Point2))は距離式に相当します。

関連する問題