我收到“昂贵的方法调用”和“空比较昂贵”的警告,我想知道如何解决这些问题。
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();
}
}
答案 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
的调用,众所周知这很昂贵,但是在这种情况下是必需的。没关系-这只是提供信息,而不是告诉您您做错了什么。