Unity VectorN变量是否重新计算?
Are Unity VectorN variables recalculated?
Unity 允许通过只读 变量 访问 vector.magnitude/sqrMagnitude/normalized 值,我不确定它是 c# 功能还是统一的东西。但是我想知道如果我在不更改向量的情况下多次使用它,它会重新计算值还是 return 它来自以前的计算。
为了可靠地回答这个问题,必须查看执行的字节码。换句话说,我们只是在 Telerik 的反编译器中打开 UnityEngine.dll
,看看 class 中发生了什么。在我的例子中,该文件位于 C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
.
在这里我们可以看到 UnityEngine.Vector3
class 的(部分)内容:
您想了解 Vector3.magnitude
、Vector3.sqrMagnitude
和 Vector3.normalized
。 .magnitude
的代码是:
public float magnitude
{
get
{
return Mathf.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}
}
这是计算矢量大小的只读 属性 的直接实现。如您所见,没有缓存。让我们看看 sqrMagnitude
.
public float sqrMagnitude
{
get
{
return this.x * this.x + this.y * this.y + this.z * this.z;
}
}
不,这里一样,不涉及缓存。但是,.normalized
很有趣。
public Vector3 normalized
{
get
{
return Vector3.Normalize(this);
}
}
这导致我们:
public static Vector3 Normalize(Vector3 value)
{
float single = Vector3.Magnitude(value);
if (single <= 1E-05f)
{
return Vector3.zero;
}
return value / single;
}
静态方法 Vector3.magnitude
与成员函数实现相同,但当然具有显式 Vector3
输入参数。
所以,从反编译的字节码可以看出:在计算.sqrtMagnitude
、.magnitude
或.normalized
时没有做缓存。因此,明智的做法是只计算这些值一次,然后尽可能重用它们,以提高性能。
Unity 允许通过只读 变量 访问 vector.magnitude/sqrMagnitude/normalized 值,我不确定它是 c# 功能还是统一的东西。但是我想知道如果我在不更改向量的情况下多次使用它,它会重新计算值还是 return 它来自以前的计算。
为了可靠地回答这个问题,必须查看执行的字节码。换句话说,我们只是在 Telerik 的反编译器中打开 UnityEngine.dll
,看看 class 中发生了什么。在我的例子中,该文件位于 C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
.
在这里我们可以看到 UnityEngine.Vector3
class 的(部分)内容:
您想了解 Vector3.magnitude
、Vector3.sqrMagnitude
和 Vector3.normalized
。 .magnitude
的代码是:
public float magnitude
{
get
{
return Mathf.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}
}
这是计算矢量大小的只读 属性 的直接实现。如您所见,没有缓存。让我们看看 sqrMagnitude
.
public float sqrMagnitude
{
get
{
return this.x * this.x + this.y * this.y + this.z * this.z;
}
}
不,这里一样,不涉及缓存。但是,.normalized
很有趣。
public Vector3 normalized
{
get
{
return Vector3.Normalize(this);
}
}
这导致我们:
public static Vector3 Normalize(Vector3 value)
{
float single = Vector3.Magnitude(value);
if (single <= 1E-05f)
{
return Vector3.zero;
}
return value / single;
}
静态方法 Vector3.magnitude
与成员函数实现相同,但当然具有显式 Vector3
输入参数。
所以,从反编译的字节码可以看出:在计算.sqrtMagnitude
、.magnitude
或.normalized
时没有做缓存。因此,明智的做法是只计算这些值一次,然后尽可能重用它们,以提高性能。