FindGameObjectWithTag(Tag标签)与Unity中的GameObjects使用公共变量的性能

时间:2015-07-13 00:52:07

标签: c# performance mobile unity3d unity5

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

根据我的经验,您最好的选择是创建一个公共变量,如果它在您需要时没有分配,请使用您的FindGameObjectWithTag方法,或者您之前找到它,将它存储在该公共变量中,这样您只能必须进行一次查找。只要你不在每一帧都执行FindGameObjectWithTag,查找命中就不会太糟糕。