使用新的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;
}
答案 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))
相当于距离公式。