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>()开始愉快的一天。:)
值得注意的是,您的第一个脚本无效且无法编译.正确的方法是使其成为全局变量,但在Start或Awake函数中缓存或初始化脚本.这些函数运行一次并用于初始化.
像这样的东西:
PlayerStats playerStats;
void Start()
{
playerStats = this.GetComponent<PlayerStats>();
}
Run Code Online (Sandbox Code Playgroud)
为了回答你的问题,GetComponent影响性能的功能被夸大了.你在互联网上到处读到这个,但这取决于它的使用频率.如果它偶尔使用一次或只用几个脚本,那就完全没问题了.
如果您GetComponent在Update函数中使用了数百个脚本实例,那么当您开始注意到一点点性能时,因为GetComponent它会调用本机端.因此,它取决于调用它的频率以及每帧执行此调用的脚本实例数.
我认为这并不重要。我刚刚做了一个检查并使用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.Stats和Enemy.Stats会更干净。