Physics Profiler 模块显示物理系统在项目场景中已处理的物理的相关信息。此信息有助于诊断和解决与项目场景中的物理相关的性能问题或意外差异。还可以使用物理调试可视化 (Physics Debug Visualization) 进一步调试和了解应用程序中的物理问题。
要打开性能分析器 (Profiler) 窗口,转到菜单:窗口 (Window) > 分析 (Analysis) > 性能分析器 (Profiler)。
物理性能分析器模块的图表可跟踪应用程序花费在物理上的时间。这些时间被分为不同的图表类别。要更改图表中类别的顺序,可以在图表的图例中拖动这些类别。还可以单击某个类别的有色图例以切换是否显示该类别。单击图表时,可以在图表下方的模块详细信息面板中看到每个图表类别的确切数值。
| 图表 | 功能 |
|---|---|
| Physics Used Memory | 物理模块所使用的内存总量。 |
| Active Dynamic Bodies | 未处于睡眠状态的刚体 (Rigidbody) 组件和接合体 (ArticulationBody) 组件的数量。 |
| Active Kinematic Bodies | 活动状态的运动刚体组件的数量。在帧中调用 MovePosition 或 MoveRotation 时,运动刚体处于活动状态,并在下一帧中保持活动状态。 注意:Unity 可能会在每帧多次处理已附加关节的运动刚体组件,这会计入所显示的值中。 |
| Dynamic Bodies | 刚体组件和接合体组件的数量。 |
| Overlaps | 重叠事件的数量。重叠事件是指碰撞体相互重叠。 |
| Trigger Overlaps | 与触发器碰撞体的重叠事件的数量(成对计数)。 |
| Discreet Overlaps | Unity 使用离散碰撞检测来解决的重叠事件的数量。 |
| Continuous Overlaps | Unity 使用连续碰撞检测来解决的重叠事件的数量。 |
| Physics Queries | 物理查询(例如射线投射和形状投射)的总量。 |
单击物理性能分析器 (Physics Profiler) 模块时,模块详细信息面板将显示有关项目场景中的物理的更多信息。
| 统计信息 | 描述 | |
|---|---|---|
| Physics Used Memory | 物理模块已使用的内存总量。 | |
| Dynamic Bodies | 刚体组件和接合体组件的数量。 | |
| Articulation Bodies | 场景中接合体组件的数量 | |
| Active Dynamic Bodies | 未处于睡眠状态的刚体组件和接合体组件的数量。 | |
| Active Kinematic Bodies | 活动状态的运动刚体组件的数量。在帧中调用 MovePosition 或 MoveRotation 时,运动刚体处于活动状态,并在下一帧中保持活动状态。 注意:Unity 可能会在每帧多次处理已附加关节的运动刚体组件,这会计入所显示的值中。 |
|
| Static Colliders | 没有刚体或接合体组件的碰撞体的数量 | |
| Colliders Synced | 与变换 (Transforms) 同步的碰撞体的数量。 | |
| Rigidbodies Synced | 与变换组件同步的刚体组件的数量。 | |
| Physics Queries | 物理查询(例如射线投射和形状投射)的总量。 | |
| Total Overlaps | 重叠事件的数量。重叠事件是指碰撞体相互重叠。 | |
| Discreet | Unity 使用离散碰撞检测来解决的重叠事件的数量。 | |
| Continuous | Unity 使用连续碰撞检测来解决的重叠事件的数量。 | |
| Trigger | 与触发器碰撞体的重叠事件的数量(成对计数)。 | |
| Modified | Unity 使用 Contact Modification API 修改的重叠事件数。 | |
| Broadphase Adds/Removes | broadphase 算法添加或删除的碰撞体的总数。 | |
| Narrowphase Touches | 自上一帧以来丢失或显示为新事件的碰撞事件的总数。 | |
此性能分析器中显示的数字可能与场景中具有物理组件的游戏对象的确切数量不对应。这是因为 Unity 以不同的速率处理一些物理组件,具体取决于哪些其他组件对其产生影响(例如,附加的关节组件)。要计算附加了特定物理组件的游戏对象的确切数量,必须使用 FindObjectsOfType 函数编写自定义脚本。
物理性能分析器模块不显示睡眠刚体组件的数量。这些组件物理系统无关,因此性能分析器不会处理它们。有关睡眠刚体组件的更多信息,请参阅有关刚体的文档。
物理模拟在主逻辑更新循环的单独固定频率更新周期中运行,只能通过每次调用的 Time.fixedDeltaTime 推进时间。这类似于 Update 和 FixedUpdate 之间的差异。有关更多信息,请参阅关于 Time 窗口的文档。
当一个复杂逻辑或图形帧需要很长时间时,此性能分析器必须每帧多次调用物理模拟。这意味着已经占用大量资源的帧会占用更多的时间和资源。这可能导致物理模拟会根据 Maximum Allowed Timestep 值而暂时停止;这个值可在项目设置 (Project Settings) 窗口设置(菜单:__编辑 (Edit) > 项目设置 (Project Settings) > 时间 (Time))__
要在项目中检测这一点,请选择 CPU 使用分析器 (CPU Usage Profiler) 模块并在__层级 (Hierarchy)__ 视图中的概述 (Overview) 部分中检查 Physics.Processing 或 Physics.Simulate 的调用次数。
在此示例图中,Calls 列中的值 2 表示物理模拟在最后一个逻辑帧上被调用了两次。
调用计数接近 10 可能表示存在问题。第一种解决方案是降低物理模拟的频率;如果问题仍然存在,请检查在物理系统必须使用大量模拟调用以便追赶游戏时间之前可能是什么原因导致了大型帧。有时,大型的图形帧可能会导致稍后在场景中进行更多物理模拟调用。
有关场景中的物理模拟的更多详细信息,请选择模块详细信息面板顶部的搜索框,搜索 Physics.Processing__,然后从面板右上方的下拉选单中选择 Calls__。此时可看到为更新场景而运行的物理系统任务的名称。可能会看到的两个最常见的名称为:
可以切换到 Legacy 模式以查看旧版本的物理性能分析器模块,这是旧版 Unity 中的默认模块。为此,请从物理性能分析器模块详细信息面板右上角的下拉菜单中选择 Legacy。
在此模式下,可以加载和检查保存在旧版 Unity 中的性能分析器数据。如果切换到此模式以检查在较新版本的 Unity 中捕获的数据,则显示的数据不可靠且不准确。应始终使用 Current 模式检查新的物理性能分析器数据。
| 统计信息 | 描述 |
|---|---|
| Active Dynamic | 活动状态的非运动刚体组件的数量。活动状态的刚体是指未处于睡眠状态的刚体。 |
| Active Kinematic | 活动状态的运动刚体组件的数量。在帧中调用 MovePosition 或 MoveRotation 时,运动刚体处于活动状态,并在下一帧中保持活动状态。 注意:Unity 可能会在每帧多次处理已附加关节的运动刚体组件,这会计入所显示的值中。 |
| Static Colliders | 没有附加刚体组件的游戏对象(无论是直接附加在游戏对象上,还是附加在其父游戏对象)上的碰撞体组件的数量。 如果碰撞体组件在附加了刚体组件的游戏对象或父游戏对象上,则这些碰撞体不计为静态碰撞体。这些称为复合碰撞体。复合碰撞体以方便的方式排列多个碰撞体,而不是将所有碰撞体放在与刚体组件相同的游戏对象上。 |
| Rigidbody | 物理系统处理的刚体组件数量(与组件是否处于睡眠状态无关)。 |
| Trigger Overlaps | 重叠触发器的数量(成对计数)。 |
| Active Constraints | 物理系统已处理的原始约束的数量。约束用作关节的构建块以及碰撞响应。例如,限制 ConfigurableJoint 的线性或旋转自由度时,每个限制都涉及一个原始约束。 |
| Contacts | 场景中所有碰撞体之间的触点对总数,包括触发器重叠对的数量。一个触点是一对触碰或重叠的碰撞体。注意:一旦碰撞体对之间的距离低于特定的用户可配置限值,Unity 就会为该碰撞体对创建触点对。因此,您可能会看到针对尚未触碰或重叠的刚体组件生成的触点。有关更多详细信息,请参阅有关 Collider.contactOffset 和 ContactPoint.separation 的文档。 |