使用新的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;
}这会比一个只有3个浮点数的普通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;
}发布于 2012-04-28 14:30:46
只有一种方法可以得到点之间的距离。这就是你描述的方式。vec3 diff = b - a; float distance = sqrtf(dot(diff, diff));
这会比普通的Vector3类更快吗?只有3个浮点数的x,y,z,然后使用sqrt,因为它使用了内部优化?
如果你担心性能,你需要分析你的应用程序,而不是试图猜测什么会更快。在你的应用程序中,“低效”解决方案的影响很可能是完全不可察觉的。
如果你开始自己编写例程,你也很有可能会降低它们的效率,或者引入bug。例如,您的“手写”代码(取决于编译器)可能比使用"XMVECTOR“的原始代码执行更多的浮点计算。在你的例程中,你需要计算两次向量之间的差值。如果编译器没有对此进行优化,你最终会得到6减法,2个加法,1个sqrtf和3个乘法。在"XMVECTOR“代码中,您将使用3个减法、2个加法、3个乘法和1个sqrtf。
对于评测应用程序,你可以使用AQTime 7标准版(目前是免费的),或者gprof (如果你正在用gcc/g++编译)。
发布于 2014-05-11 17:32:40
D3DXVec3Length(&(Point1-Point2))等同于距离公式。
https://stackoverflow.com/questions/10291862
复制相似问题