GetComponent <>()是否会影响性能

Ale*_*tic 1 c# performance unity-game-engine

正如标题所说,GetComponent()确实对性能产生了很大的影响.

我问这个是因为我不喜欢这样做:

public class Player : MonoBehaviour
{
    PlayerStats playerStats = this.GetComponent<PlayerStats>();

    void Update()
    {
        var something = playerStats.Asd;
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是我喜欢这样使用它:

public class Player : MonoBehaviour
{
    void Update()
    {
        var something = this.GetComponent<PlayerStats>().Asd;
    }
}
Run Code Online (Sandbox Code Playgroud)

原因是因为我喜欢在很多脚本断码(很容易对我来说,如果需要以后改变的东西,也对多个对象使用一个脚本),因此,如果我有很多的脚本我需要看到,如果我有已经定义PlayerStats playerStats....但不仅仅是这个,而是很多.

那么使用第二种方法会减慢我的游戏速度吗?

小智 6

使用第一种方法的主要吸引力在于,您可以将这些变量设置为公共,然后直接从 Unity 编辑器访问它们,从而允许您根据需要拖放组件。

函数调用的第二个实例GetComponent意味着您没有缓存变量,从而通过可能不必要的检查减慢了代码速度。所以我的建议是坚持在内存中定义变量然后更改的第一个实例,而不是每次都分配内存然后更改。

还有一个旁注。this.GetComponent如果脚本附加到对象,则不需要调用,因为脚本派生自MonoBehaviour; 您只需打电话即可GetComponent<type>()开始愉快的一天。:)


Pro*_*mer 5

值得注意的是,您的第一个脚本无效且无法编译.正确的方法是使其成为全局变量,但在StartAwake函数中缓存或初始化脚本.这些函数运行一次并用于初始化.

像这样的东西:

PlayerStats playerStats;

void Start()
{
    playerStats  = this.GetComponent<PlayerStats>();
}
Run Code Online (Sandbox Code Playgroud)

为了回答你的问题,GetComponent影响性能的功能被夸大了.你在互联网上到处读到这个,但这取决于它的使用频率.如果它偶尔使用一次或只用几个脚本,那就完全没问题了.

如果您GetComponentUpdate函数中使用了数百个脚本实例,那么当您开始注意到一点点性能时,因为GetComponent它会调用本机端.因此,它取决于调用它的频率以及每帧执行此调用的脚本实例数.



Aus*_*yan 5

我认为这并不重要。我刚刚做了一个检查并使用for循环 1,000,000 次,发现两帧之间有完全相同的 0.02 时间延迟。

话虽这么说,它会让你的代码更干净,因为Player.Stats.Asd它比Player.GetComponent<PlayerStats>().Asd. 它使意图更加明显。我确信将其存储为带有 a 的变量仍然是一个微观优化public PlayerStats Stats { get; set; },但如果您一直使用它,那就真的是这样。

您不应该对每个脚本都使用变量Component,因为如果您对每个脚本都这样做,则使用的内存将开始增加。

另外,请注意,我之所以这么称呼它,Stats并不是PlayerStats因为Player.PlayerStats它是不必要的冗余。它的实际类型应该称为PlayerStatsyes,以免与 混淆EnemyStats,但是当您同时使用两者时,拥有Player.StatsEnemy.Stats会更干净。