FindGameObjectWithTag(Tag tag) 与在 Unity 中使用 Public 游戏对象变量的性能对比

Performance of FindGameObjectWithTag(Tag tag) Versus Using Public Variables for GameObjects in Unity

基本上,我正在尝试为移动设备的 Unity 优化游戏。因此,包含CPU用法势在必行。由于这是一个复杂的游戏,许多脚本相互引用(以及它们的游戏对象)。目前,我正在使用 GameObject.FindGameObjectWithTag(Tag tag) 来引用其他游戏对象、组件和脚本。我也知道这可以通过在编辑器中使用拖放来使用 public 变量来完成。但是我知道哪个游戏对象会被放入每个级别,我发现第一个选项使用起来更简单,因为拖放多次导致错误并且使用起来很乏味。然而,这不会成为问题,而且我觉得其中一个或另一个的性能超过了这些回退。我想知道这两种方法在性能方面是否存在差异,哪种方法更适合高性能、移动方面。

根据我的经验,您最好的选择是创建一个 public 变量,如果在您需要它时未分配它,请使用您的 FindGameObjectWithTag 方法,或者您之前找到它的方法,将其存储在 public 变量所以你只需要做一次查找。只要您不是每帧都执行 FindGameObjectWithTag,查找命中率就不会太差。

FindGameObjectWithTag() 在最坏的情况下具有复杂性 O(n)。如果您的场景中有少量对象并且搜索带有标签的对象的对象数量很少,您将不会遇到性能问题。

另一种方法是在脚本中序列化这些对象并使用它们。使用这种方法可以减少 CPU 使用量并增加内存使用量,因为场景中不存在元对象或者您没有为它们分配内存。

如果可能的话,我建议您使用第三种方法。在 Google 和 YouTube 上搜索单例模式。如果它一直为 1,它允许您引用该对象,而无需每次都尝试使用 FindGameObjectsWithTag() 找到它...导致非常小的 CPU 和内存使用。