【问题标题】:Performance of FindGameObjectWithTag(Tag tag) Versus Using Public Variables for GameObjects in UnityFindGameObjectWithTag(Tag tag) 与在 Unity 中为游戏对象使用公共变量的性能
【发布时间】:2015-07-13 00:52:07
【问题描述】:

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

【问题讨论】:

  • 最好简单测试一下。我知道那是平庸的“自己动手!”建议,但如果您将自己的代码与您自己的(其他)代码进行基准测试,您将获得针对您的特定场景的最可靠和最准确的信息。
  • @DanielHoffmann-Mitscherling 实际上我就是这么做的。我最初使用拖放方法,但由于代码导致非常混乱,包含许多不必要的(在我看来无论如何)公共变量,我选择使用 FindGameObject 选项。但是,我不知道我是否只是偏执,因为从一个到另一个有一个小的变化。我只是好奇是否有一个“正确”的答案,如果你愿意的话。
  • 基准测试。使用 FindWithTag 和您的其他方法计时一些循环。看看哪个更快。
  • @Chris 是的,这基本上就是我所做的。我用两种方法查看了时间和游戏的帧速率。在查看分析器时,我发现 FindWithTag 选项得到了更好的优化,但具有讽刺意味的是,我认为 FPS 可能更倾向于拖放方法。这就是为什么我不知所措并想知道最后一条评论中是否有“已接受”的答案。
  • 使用带有 [SerializeField] 标签的私有变量不是更好吗?

标签: c# performance mobile unity3d unity5


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,在我的案例中,帧丢失的原因实际上是 Update 中的 FindGameObjectWithTag。我以为我已经缓存了变量,但仍然有一些杂散的情况。这样做将帧速率提高了近 30-40 fps。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多