使用DirectXMath获得2点之间距离的最佳方法是什么

时间:2012-04-24 04:46:55

标签: c++ directx direct3d direct3d11 xna-math-library

使用新的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;
}

这是否比普通的Vector3类更快,只有3个浮点数用于x,y,z,然后使用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;
}

2 个答案:

答案 0 :(得分:5)

只有一种方法可以获得积分之间的距离。这就是你描述的方式。 vec3 diff = b - a; float distance = sqrtf(dot(diff, diff));

  

这会比普通的Vector3类更快,只有3个浮点数用于x,y,z,然后使用sqrt,因为它使用内在优化吗?

如果您担心性能问题,则需要对应用程序进行分析,而不是试图猜测什么会更快。 “#效率低下”的影响非常大。"在您的应用程序中,解决方案将完全不明显。

如果你自己开始编写例程,那么你很有可能会降低它们的效率或引入错误。例如你的手写"代码可能(取决于编译器)执行比使用" XMVECTOR"的原始代码更多的浮点计算。在您的例程中,您计算​​两次向量之间的差异。如果编译器没有对其进行优化,那么最终会有 6 减法,2次加法,1次sqrtf和3次乘法。在" XMVECTOR"代码你将使用 3 减法,2次加法,3次乘法和1次sqrtf。

对于分析应用程序,您可以使用AQTime 7 Standard(目前是免费的)或gprof(如果您使用gcc / g ++进行编译)。

答案 1 :(得分:3)

D3DXVec3Length(&(Point1-Point2))相当于距离公式。