Unity的优化:场景的层次结构如何窃取您

因此,您已经优化了游戏中最明显的部分。 但是,实际上并非如此。 您错过了一个棘手但不太明显的要点:优化Unity场景层次。

层次结构有什么问题? 让我给你看一些东西。

启动Unity并打开您的游戏项目。 然后在目标设备上运行游戏
并将Unity Profiler连接到它。 在游戏过程中记录几帧。

在Unity Profiler中,查找以下讨厌的Profiler标记


没找到? 继续寻找,我确定至少有一个。

它可以是UpdateRendererBoundingVolumesPhysics.SyncColliderTransformTransformChangedDispatch

当您准备放弃时,它们会出现。 当您将鼠标悬停在Profiler关闭按钮上时,它们就会发生。

找到了吗 如果是这样,那么您很幸运。 我还在我以前的项目之一中找到了它们,并找到了如何完全摆脱它们的方法。 我意识到其中隐藏着什么邪恶...

是否想了解Unity场景层次性能秘密

级别1开发人员:典型的Unity场景层次结构


我仍然记得十年前从事的第一个Unity项目。

我仍然仍然不太了解游戏对象和组件之间的区别。

但这没关系,我仍然创造游戏。

图片

我是否熟悉过这样一个混乱的统一场景层次结构? 实际上是,因为有时情况会更糟。 但是,很好奇的是,这种等级制常常可以被放弃。 但是你会受苦的。 您稍后必须付款。

幸运的是,在我开始专业开发游戏之前,我学会了欣赏更加结构化的层次结构。

场景层次结构的质量结构可以是您最好的朋友。 该结构大大简化了开发和协作。

无论是什么意思,它都不一定是完美的。 她成为一个好人就足够了。 但是要小心。 这很重要。

垃圾场景层次结构很危险,会给您带来麻烦,因为您不太可能直接注意到它的副作用。

令人恐惧的幽灵会困扰着您,使您减速并向后拉。 有时您会回头,但是后面什么也没有。 因此,您将习惯于缓慢移动。

多年来,我已经学会了诊断这些副作用。 主要问题是混沌层次结构的副作用很难跟踪。

您将看到分析器,但是您将不知道标记的含义。 他们的名字常常是神秘的……他们保留着什么秘密? 只有一件事可以确定:神秘的标记告诉我们一些值得探索的东西。

当我们讨论改善场景结构时,通常是指提高可理解性并降低支持成本。 但是每个人都忘记了性能。

让我们分析上面显示的场景层次。 它包含2,000个旋转球体,一个球体相互嵌套

探查者对此有何看法? 让我们看看。

图片

Unity场景层次结构优化:层次结构探查器概述

对于简单的预制件以及将旋转脚本应用于常规球体的性能非常差。 如您所见, Physics.SyncColliderTransformUpdateRendererBoundingVolumes占据帧时间预算很大一部分。 但是,我们不要对此做完分析,因为我对此案很好奇。

让我们更深入。


层次分析器详细信息

这是文章问题的答案。

未优化的层次结构在Unity中导致两个BIG问题。

  • 深入的层次结构使作业系统无法并行有效地工作
  • 嵌套层次结构会触发某些Unity子系统中的瓶颈。

不要忘记它,因为它适用于所有类型的动态对象 ,尤其是用户界面。

供参考:我正在研究具有16个物理核心和32个线程的Threadripper。 您知道其中有多少人在这个项目中有效吗? 只有一个。

不用说,游戏性能因此而受到影响。 而且,如果您尝试通过理解所有这些神秘的名称来纠正这种情况,那么过早地过时。

2级开发人员将如何处理2,000个对象?

级别2开发人员:优化的Unity场景层次结构


Unity 2级开发人员知道子转换是有代价的。 他还知道这种情况下的价格是CPU时间的毫秒数。 或者开发人员花费大量时间来解决此问题。

问自己:CPU时间预算是否足以支付如此广泛的层次结构?

您需要从几毫秒内进入游戏的哪个区域?

这将必须减少美丽颗粒的数量吗? 还是玩家必须战斗的怪物数量? 希望您不必执行任何操作,但是更好...

创建有效的场景层次结构并销毁次优层次结构。

复杂的子对象嵌套会窃取游戏资源的原因很简单: 转换中的每个更改都会影响孩子,甚至可能影响具有同级的父母。

当您更改对象的位置,旋转或比例时,Unity会重述许多方面。 引擎自行执行此操作,因此您可以专注于游戏。 这很棒,但是如果您不知道,价格可能会变成天文数字。

有什么解决办法? 保持简单,并遵循干净的Unity场景层次结构的黄金法则:

  • 每个游戏对象总共不超过50个孩子
  • 任何游戏对象上的嵌套不得超过4个级别。

那不容易吗? 级别2开发人员创建尽可能统一的场景的统一层次结构。

看一下下面的图片。 相同数量的对象,但是这次将其构造为一个平面层次结构。


节省了很多。

但是说起来容易做起来难,不是吗? 分离和破坏对象之间的关系是费力的,容易出错的并且需要长时间的工作。

3级开发人员会做什么?

3级开发人员:FAP层次结构工具


优秀的Unity开发人员可以胜任。 出色的 Unity开发人员可以更快,更准确地完成这项工作。 但是他如何成功? 借助工具。 由于唯一便宜的等级是空等级,因此要评估游戏,您需要回答以下问题...

您的层次结构有多复杂?

可以通过系统地分析层次结构并给它们一个数字等级来回答这个问题。


需要哪些数学公式来计算此估算? 幸运的是,没有。 我为你做了一切。 我编写了一个原型工具,用于根据上述黄金规则自动分析和识别层次结构中的瓶颈。

我将其称为“ 神话般的高级分析层次结构工具” 。 启动游戏。 进入有趣的时刻。 打开工具,让它完成其余的工作。


该工具将给您一个整数等级。 一旦知道分数,您就会知道该怎么做...还是不?

因为我不仅为您提供此工具,还为您提供了一个附加脚本,使您可以增强消除层次结构问题的能力。 我为您提供了一个简单的DetachGameObject.cs脚本的功能。

很少有27行的脚本可以在这么短的时间内提高性能。 它的工作很简单:在程序执行过程中,它将沉重的嵌入式游戏对象移至场景层次结构的根。 因此,您可以在设计时利用结构化层次结构,在运行时获得巨大的性能改进。

您很有可能可以在具有强大嵌套结构的层次结构的很大一部分中执行此操作。

您可以在原始文章的末尾下载该工具和脚本。

Source: https://habr.com/ru/post/zh-CN481510/


All Articles