Unity:昂贵的方法调用和null比较昂贵-解决方案(RIDER IDE)?

时间:2019-09-09 07:12:35

标签: unity3d rider

我收到“昂贵的方法调用”和“空比较昂贵”的警告,我想知道如何解决这些问题。

    void Update()
    {       
        CheckCollision();
    }

以及发生错误的CheckCollison中,如下面的注释所示。

    void CheckCollision()
    {
        var topHit = Physics2D.OverlapCircle(topCollision.position, 0.2f, playerLayer);

        if (topHit != null) // ***<<<< NULL COMPARISON EXPENIVE!***
        {
            if (topHit.gameObject.CompareTag("Player"))
            {
                if (!stunned)
                {
                    var rigidBodyTopHit = topHit.gameObject
                    .GetComponent<Rigidbody2D>();  // ***<<<< EXPENSIVE METHOD INVOCATION!***

                    rigidBodyTopHit.velocity = new Vector2(rigidBodyTopHit.velocity.x, 7f);
                    canMove = false;
                    _myBody.velocity = new Vector2(0,0);
                    _animator.Play("SnailStunned");
                    stunned = true;
                }
            }
        }
        if (!Physics2D.Raycast(downCollision.position, Vector2.down, 0.1f))
        {
            ChangeDirection();
        }
    }

1 个答案:

答案 0 :(得分:3)

这些不是警告,而是信息摘要。它们旨在告知您,在性能敏感的上下文(Update方法)内您正在做的事情是昂贵的,并且您可以在必要时重新评估方法

“如有必要”位很重要-只有您可以确定此Update方法的性能特征是否适合您的游戏/应用程序。如果这种情况发生在很少使用的选项屏幕中的单个游戏对象中,则很可能不是问题。但是,如果它在对象中被实例化了许多次并用于核心游戏中,则也许这些昂贵的方法会加起来并降低性能(或影响电池寿命)。

通常来说,编写没有任何这些要点亮点的代码可能会非常困难(而且没有必要),但是如果您发现自己的很多代码都有很多要点,那么一个很好的指示,您应该进行概要分析,看看您是否对结果满意。

您可以通过使用 Alt + Enter ,展开检查选项项并选择“为什么Rider / ReSharper建议这样做吗?”来找到有关这些重点的更多信息。项目。这将打开一个网页,其中包含有关该突出显示的更多详细信息。

This page also has an overview and more details,并且还可以在首选项|禁用检查。编辑器检查设置|检验等级C#设置页面(在 Unity |性能指标下)。

查看代码示例中标记的项目,相等性比较昂贵,因为相等性比较还会检查底层引擎对象是否已被破坏,这意味着过渡到了本机代码。如果您知道该对象尚未销毁(并且看到它是从Unity API返回的,我认为这是安全的选择),那么可以将其替换为:

if (!Object.ReferenceEquals(topHit, null)) {
  // … 
}

但是请记住,在您的用例中,这是不必要的微优化。

(用bool调用隐式if (!topHit)运算符与if (topHit != null)both operators调用私有Object.CompareBaseObjects method完全相同)< / p>

第二项是对GetComponent的调用,众所周知这很昂贵,但是在这种情况下是必需的。没关系-这只是提供信息,而不是告诉您您做错了什么。

相关问题