5

使用新的 XMVECTOR 和 XMFLOAT3 类获得两点之间距离的最佳方法是什么?我在 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;
}
4

2 回答 2

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++ 编译)。

于 2012-04-28T06:30:46.287 回答
3

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

于 2014-05-11T09:32:39.640 回答