gpt4 book ai didi

c# - Unity VectorN变量是否重新计算?

转载 作者:行者123 更新时间:2023-11-30 15:20:18 24 4
gpt4 key购买 nike

Unity 允许通过只读变量 访问 vector.magnitude/sqrMagnitude/normalized 值,我不确定它是 c# 特性还是 unity 的东西。但是我想知道如果我在不更改向量的情况下多次使用它,它会重新计算该值还是从之前的计算中返回它。

https://docs.unity3d.com/ScriptReference/Vector3.html

最佳答案

为了可靠地回答这个问题,必须查看执行的字节码。换句话说,我们只是在 Telerik 的反编译器中打开 UnityEngine.dll 来查看该类中发生了什么。在我的例子中,该文件位于 C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll

在这里我们可以看到 UnityEngine.Vector3 类的(部分)内容:

enter image description here enter image description here

您想了解 Vector3.magnitudeVector3.sqrMagnitudeVector3.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 时没有进行缓存。因此,明智的做法是仅计算一次这些值,然后尽可能重复使用它们以提高性能。

关于c# - Unity VectorN变量是否重新计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com