5

新しい XMVECTOR および XMFLOAT3 クラスを使用して、2 点間の距離を取得する最良の方法は何ですか? XMVector* ファミリの関数でそれを行う関数が見つからなかったため、次のように思いつきました。

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 つの float しかなく、sqrt を使用する通常の Vector3 クラスよりも高速ですか? すなわち:

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;
}
4

2 に答える 2

5

ポイント間の距離を取得する方法は 1 つしかありません。そして、それがあなたが説明した方法です。vec3 diff = b - a; float distance = sqrtf(dot(diff, diff));

これは、組み込みの最適化を使用するため、x、y、z に 3 つの float しかなく、sqrt を使用する通常の Vector3 クラスよりも高速ですか?

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

また、自分でルーチンを書き始めると、ルーチンの効率が低下したり、バグが発生したりする可能性が非常に高くなります。たとえば、「手書き」のコードは、(コンパイラによっては) 「XMVECTOR」を使用する元のコードよりも多くの浮動小数点計算を実行する場合があります。あなたのルーチンでは、ベクトル間の差を 2 回計算します。コンパイラがそれを最適化しない場合、6 回の減算、2 回の加算、1 回の sqrtf、および 3 回の乗算が発生します。「XMVECTOR」コードでは、3 つの減算、2 つの加算、3 つの乗算、および 1 つの sqrtf を使用します

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

于 2012-04-28T06:30:46.287 に答える