2012-04-24 2 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 * 가정에서 그것을 수행하는 기능을 찾을 수 없습니다 intrinsic 최적화를 사용하기 때문에 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

포인트 간 거리는 한 가지 방법 만 있습니다. 그리고 그것은 당신이 묘사 한 방식입니다.

vec3 diff = b - a; float distance = sqrtf(dot(diff, diff));이 그 고유 최적화를 사용하기 때문에 SQRT를 사용 후 X, Y, Z 단지 3 수레 통상 Vector3 클래스보다 빠르게 할 것인가?

성능에 대해 걱정이된다면 무엇이 더 빠를 것인지 추측하는 대신 응용 프로그램의 프로필을 작성해야합니다. "덜 효율적인"솔루션의 영향은 애플리케이션에서 완전히 눈에 띄지 않을 것입니다.

루틴을 직접 작성하면 효율성이 떨어지거나 버그가 발생할 가능성이 매우 높습니다. 예를 들어 "손으로 직접 작성한"코드는 컴파일러에 따라 "XMVECTOR"를 사용하는 원래 코드보다 더 많은 부동 소수점 계산을 수행 할 수 있습니다. 루틴에서 벡터의 차이를 두 번 계산합니다. 컴파일러가이를 최적화하지 않으면 빼기, 2 추가, 1 sqrtf 및 3 곱셈으로 끝납니다. "XMVECTOR"코드에서는 빼기, 2 덧셈, 3 곱셈 및 1 sqrtf를 사용합니다.

프로파일 링 응용 프로그램의 경우 AQTime 7 Standard (현재 무료) 또는 gprof (gcc/g ++로 컴파일하는 경우)를 사용할 수 있습니다.

3

D3DXVec3Length(&(Point1-Point2))은 거리 공식과 같습니다.

관련 문제