Physics Profiler 模块显示物理引擎在场景中已处理的物理的相关信息。此信息有助于诊断和解决与场景中的物理相关的性能问题或意外差异。 有关在应用程序中调试物理的更多信息,请参阅物理调试可视化的文档。
Physics Profiler 模块的图表可跟踪应用程序花费在物理上的时间。这些时间被分为七个类别。要更改图表中类别的顺序,可以在图表的图例中拖放这些类别。还可以单击某个类别的有色图例以切换是否显示。
单击图表时,可以在图表下方的模块详细信息面板中看到每个图表类别的确切数值。
图表 | 功能 |
---|---|
Active Dynamic | 活动状态的非运动刚体组件的数量。活动状态的刚体是指未处于睡眠状态的刚体。 |
Active Kinematic | 活动状态的运动刚体组件的数量。在帧中调用 MovePosition 或 MoveRotation 时,运动刚体处于活动状态,并在下一帧中保持活动状态。 注意:Unity 可能会在每帧多次处理已附加关节的运动刚体组件,这会计入显示的值中。 |
Static Colliders | 未附加刚体组件或父游戏对象未附加刚体组件的游戏对象上的碰撞体组件数。 具有刚体组件的游戏对象或父游戏对象不计为静态碰撞体。这些游戏对象称为复合碰撞体。复合碰撞体以方便的方式排列多个碰撞体,而不是将所有碰撞体放在与刚体组件相同的游戏对象上。 |
Rigidbody | 物理引擎处理的刚体组件数量(与组件的睡眠状态无关)。 |
Trigger Overlaps | 重叠触发器的数量(成对计数)。 |
Active Constraints | 物理引擎已处理的原始约束的数量。约束用作关节的构建块以及碰撞响应。例如,限制 ConfigurableJoint 的线性或旋转自由度涉及每个限制的基本约束。 |
Contacts | 场景中所有碰撞体之间的触点对总数,包括触发器重叠对的数量。一个接触点是一对触碰或重叠的碰撞体。注意:一旦每个碰撞体对之间的距离低于特定的用户可配置限制,Unity 就会为该碰撞体对创建触点对。因此,可能会看到针对尚未触碰或重叠的刚体组件生成的触点。有关更多详细信息,请参阅 Collider.contactOffset 和 ContactPoint.separation 的文档。 |
此性能分析器中显示的数字可能与场景中具有物理组件的游戏对象的确切数量不对应。这是因为 Unity 以不同的速率处理一些物理组件,具体取决于其他组件产生的影响(例如,附加的关节组件)。要计算附加了特定物理组件的游戏对象的确切数量,必须使用 FindObjectsOfType 函数编写自定义脚本。
Physics Profiler 模块不显示睡眠刚体组件的数量。这些是与物理引擎无关的组件,因此不由性能分析器处理。有关睡眠刚体组件的更多信息,请参阅刚体的文档。
物理模拟在主逻辑更新循环的单独固定频率更新周期中运行,只能通过每次调用的 Time.fixedDeltaTime 推进时间。这类似于 Update 和 FixedUpdate 之间的区别。有关更多信息,请参阅关于 Time 窗口的文档。
当一个复杂逻辑或图形帧需要很长时间时,此性能分析器必须每帧多次调用物理模拟。这意味着已经占用大量资源的帧会占用更多的时间和资源。这可能导致物理模拟会根据 Maximum Allowed Timestep 值而暂时停止;这个值可在 Project Settings 窗口(菜单:__Edit > Project Settings > Time__)中设置。
要在项目中检测到这一点,请选择 CPU Usage Profiler 模块 并在 Hierarchy 视图中的 Overview 部分中检查 Physics.Processing 或 Physics.Simulate 的调用次数。
在此示例图中,Calls 列中的值 1 表示物理模拟在最后一个逻辑帧上被调用一次。
调用计数接近 10 可能表示存在问题。第一种解决方案是降低物理模拟的频率;如果问题仍然存在,请检查在物理引擎必须使用大量模拟调用以便追赶游戏时间之前可能是什么原因导致了大型帧。有时,大型的图形帧可能会导致稍后在场景中进行更多物理模拟调用。
有关场景中的物理模拟的更多详细信息,请选择模块详细信息面板顶部的搜索框,搜索 Physics.Processing__,然后从面板右上方的下拉选单中选择 Show Calls__。此时可看到为更新场景而运行的物理引擎任务的名称。可能会看到的两个最常见的名称为:
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.