【问题标题】:Are Unity VectorN variables recalculated?Unity VectorN 变量是否重新计算?
【发布时间】:2016-11-01 14:37:27
【问题描述】:

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

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

【问题讨论】:

  • 最好寻求统一支持

标签: c# unity3d unity5


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-10
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多