Mar*_*ith 3 unity-game-engine rider
我收到“昂贵的方法调用”和“空值比较昂贵”的警告,我想知道如何解决这些问题。
void Update()
{
CheckCollision();
}
Run Code Online (Sandbox Code Playgroud)
并在发生错误的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这些不是警告,而是信息重点。它们旨在通知您,您在性能敏感的上下文(Update方法)中正在做一些已知代价高昂的事情,并且您可以在必要时重新评估您的方法。
“如有必要”这一点很重要 - 只有您可以决定此Update方法的性能特征是否适合您的游戏/应用程序。如果这发生在很少使用的选项屏幕中的单个游戏对象中,那么这很可能不是问题。但是如果它在一个被实例化多次并用于核心游戏玩法的对象中,也许这些昂贵的方法会加起来并降低性能(或影响电池寿命)。
一般来说,编写没有任何这些信息亮点的代码可能会非常困难(并且没有必要),但是如果您发现您有很多代码有很多亮点,那么这是一个很好的迹象你应该分析一下,看看你是否对结果满意。
您可以通过使用Alt+ Enter、展开检查选项项并选择“为什么 Rider/ReSharper 建议这样做?”来了解有关这些亮点的更多信息。物品。这将打开一个网页,其中包含有关该特定亮点的更多详细信息。
此页面还有概述和更多详细信息,也可以在首选项 | 中禁用检查。编辑 | 检验设置 | 检查严重性 | C#设置页面(在Unity | 性能指标下)。
查看代码示例中标记的项目,相等比较是昂贵的,因为它还会检查底层引擎对象是否已被破坏,这意味着转换到本机代码。如果您知道对象没有被销毁(并且看到它是从 Unity API 返回的,我认为这是一个安全的赌注),那么您可以将其替换为:
if (!Object.ReferenceEquals(topHit, null)) {
// …
}
Run Code Online (Sandbox Code Playgroud)
但请记住,在您的用例中,这是一个可能不必要的微优化。
(调用隐式bool运算符与if (!topHit)完全相同if (topHit != null),两个 运算符都调用私有Object.CompareBaseObjects方法)
第二项是对 的调用GetComponent,众所周知,这很昂贵,但在此上下文中是必需的。没关系 - 这只是提供信息,而不是告诉你你做错了什么。
| 归档时间: |
|
| 查看次数: |
5732 次 |
| 最近记录: |