4

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

    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();
        }
    }
4

1 回答 1

10

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

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

一般来说,编写没有任何这些信息亮点的代码可能会非常困难(并且没有必要),但如果你发现你有很多代码有很多亮点,那么这是一个很好的迹象你应该分析一下,看看你对结果是否满意。

Alt您可以通过使用+ Enter、展开检查选项项目并选择“为什么 Rider/ReSharper 建议这样做?”来了解有关这些亮点的更多信息。物品。这将打开一个网页,其中包含有关该特定亮点的更多详细信息。

此页面还包含概述和更多详细信息,也可以在首选项 |中禁用检查。编辑 | 检查设置 | 检查严重性 | C#设置页面(在Unity | Performance Indicators下)。

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

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

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

(调用隐式bool运算符与if (!topHit)完全一样if (topHit != null)两个 运算符都调用私有Object.CompareBaseObjects方法

第二项是对 的调用GetComponent,这被认为是昂贵的,但在这种情况下是必要的。没关系 - 这只是提供信息,而不是告诉你你做错了什么。

于 2019-09-10T10:55:32.960 回答