Unity VectorN变量是否重新计算?

时间:2016-11-01 14:37:27

标签: c# unity3d unity5

Unity允许通过只读变量访问vector.magnitude / sqrMagnitude /规范化值,我不确定它是c#特征还是统一的东西。但是我想知道如果我多次使用它而不更改向量,它会重新计算该值或从之前的计算中返回它。

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

1 个答案:

答案 0 :(得分:4)

为了可靠地回答这个问题,我们必须查看执行的字节码。换句话说,我们只是在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时,没有进行缓存。因此,反过来,只计算一次这些值,然后在可能的情况下重复使用它们,以获得性能增益。