15.Profiler窗口Physics

15.Unity性能分析工具-Profiler窗口Physics


15.1 知识点

Physics是什么

Physics(物理学)模块是专门用于监控物理系统(3D 物理)运行状态与性能开销的工具。它涵盖了 Rigidbody、Collider、碰撞检测、物理查询等运行时数据,主要帮助我们排查 3D 物理相关问题。

在游戏中如果出现以下问题时,可以着重观察这里的内容:

  1. 碰撞相关逻辑不触发
  2. 性能异常抖动(可能是物理计算量太大)
  3. 射线检测变慢
  4. 物理不稳定
  5. 等等

总之,几乎所有和 3D 物理相关的问题,我们都可以通过该模块进行排查。

Physics中各参数功能的含义和作用

物理学(Physics)分析窗口

  • Physics Used Memory:当前物理系统使用的总内存量(包括碰撞体、刚体、内部缓存等)。如果持续上升或占用过高,可能存在碰撞体未销毁或分配过多的问题
  • Active Dynamic Bodies:当前活动中的动态刚体(Rigidbody)数量(受力、移动、正在计算中)。是物理运算的主要开销来源,数量越多计算越重
  • Active Kinematic Bodies:当前活动中的运动学刚体(isKinematic = true)数量。虽不受物理驱动,但仍会影响碰撞检测,数量多时也有开销
  • Dynamic Bodies:所有存在的动态刚体数量(包括非活动的)。用于判断是否创建了过多物理对象、未及时销毁
  • Overlaps:本帧中发生的碰撞重叠事件总数(包括触发器)。用于判断是否物体堆叠太多,或重叠检测负担重
  • Trigger Overlaps:本帧中发生的 Trigger(触发器)之间或与刚体之间的重叠事件数量。用于判断是否大量使用触发器,逻辑处理是否冗余
  • Discreet Overlaps:使用离散检测模式(Discrete)的碰撞重叠数量。默认检测模式,适用于大多数物体,效率较高
  • Continuous Overlaps:使用连续检测模式(Continuous / Continuous Dynamic)的碰撞重叠数量。连续检测更精确但开销大,数量多时需关注性能
  • Physics Queries:本帧中所有物理查询的调用次数(如射线检测、范围检测等)。频繁的物理查询是物理系统性能瓶颈的重要来源,过多需优化

当前的信息窗口

  • Physics Used Memory:当前物理系统使用的总内存量(包括碰撞体、刚体、内部缓存等)。如果持续上升或占用过高,可能存在碰撞体未销毁或分配过多的问题

  • Dynamic Bodies:所有存在的动态刚体数量(包括非活动的)。用于判断是否创建了过多物理对象、未及时销毁

  • Articulation Bodies:关节刚体数量,表示场景中启用了 ArticulationBody(关节体)的对象个数。此类刚体通常用于高级机器人结构或物理链式系统。相比普通 Rigidbody 开销大,慎用。如果数量太大(上百个),说明使用过多,建议减少数量

  • Active Dynamic Bodies:当前活动中的动态刚体(Rigidbody)数量(受力、移动、正在计算中)。是物理运算的主要开销来源,数量越多计算越重

  • Active Kinematic Bodies:当前活动中的运动学刚体(isKinematic = true)数量。虽不受物理驱动,但仍会影响碰撞检测,数量多时也有开销

  • Static Colliders:静态碰撞体数量(无 Rigidbody 的 Collider)。表示绑定在静态对象(如场景建筑、地面等)上的碰撞体总数。这类碰撞体不会随时间移动,效率较高。但过多也会增加碰撞体树构建成本,需合并或使用批处理。尽量用最少的碰撞盒表示对象体积范围

  • Colliders Synced:本帧同步到物理系统的碰撞体数量。表示 Unity 本帧向物理引擎同步的 Collider 数量(例如位置/旋转发生变化)。频繁变动会导致物理系统不断重建碰撞体结构,影响性能。尽量使用刚体加力的形式让对象移动

  • Rigidbodies Synced:本帧同步到物理系统的刚体数量。频繁设置 transform.position 或修改 velocity 都会触发同步,尤其在大批量刚体上影响显著。尽量使用刚体加力的形式让对象移动

  • Total Overlaps:重叠检测总数量,在其中可以看到不同类型的情况

    • Discreet:离散检测重叠数。正常游戏中这一项会是最多的
    • Continuous:连续检测重叠数。建议仅对高速移动物体(如子弹、快速飞行物)使用连续检测,其它物体请用 Discrete
    • Trigger:触发器重叠次数。尽量避免重叠区域之间反复进入退出
    • Modified:修改过的碰撞体参与的重叠次数。在本帧中修改过的碰撞体(如大小、位置、开关状态等)所参与的重叠检测次数。这类操作通常会强制 Unity 更新碰撞体树结构,产生额外开销
  • Broadphase Adds/Removes:广义阶段的添加和移除

    • 广义阶段:用来快速判断哪些物体”可能发生碰撞”,通常使用包围盒(AABB)进行粗略检测,性能消耗低、处理大批量对象的效率高
    • Adds:本帧中,被添加到物理世界中、需要参与碰撞检测的新对象(或更新后重新注册的对象)数量。例如:新创建了一个带 Collider 的物体,或修改了碰撞体的位置/尺寸等
    • Removes:本帧中,被从 Broadphase 系统中移除的碰撞体数量。例如:销毁了对象、禁用了 Collider、将其移出物理世界

    关注点:当添加和删除只有 0~几十个时是正常范围;几百以上,需要关注,可能存在频繁修改或销毁碰撞体的逻辑;上千甚至持续增长,严重性能问题,建议重点优化对象生命周期管理

  • Narrowphase Adds/Removes:狭义阶段的添加和移除

    • 狭义阶段:对 Broadphase 结果中的物体做更精确的碰撞计算(如 Mesh vs. Capsule),开销大,但只处理可能碰撞的对象
    • New:新增精确碰撞对数量。表示本帧中,首次发生精确碰撞检测的物体对数量。也就是两个 Collider 首次接触,需要进入精确计算流程
    • Lost:丢失精确碰撞对数量。表示本帧中,不再发生碰撞的物体对数量。也就是上一帧接触,本帧分离,因此这个”碰撞对”失效了

    注意:这些统计的是 Collider 与 Collider 之间的成对检测关系,不包括 Trigger 类型的重叠检测。

    关注点:New 和 Lost 都比较稳定且不高,正常,无需担心;New 和 Lost 每帧几百甚至上千,说明接触频繁创建销毁,可能有性能问题;New 持续增长而 Lost 很少,可能创建了很多新物体但未释放;Lost 持续增长而 New 很少,可能大量销毁物体但未创建新物体或发生了某种分离行为

遗留信息窗口(老版本)

可以忽略,当前的信息窗口更加详细。

  • Active Dynamic:活跃的动态刚体数。当前正在运动、受力或碰撞的 Rigidbody 数量(即处于活跃状态的非静止刚体)。是物理计算的主要开销源
  • Active Kinematic:活跃的运动学刚体数。当前正在被手动控制位置或旋转(isKinematic = true)且仍参与物理系统交互的对象数量。例如用于角色控制器、动画驱动骨骼等
  • Static Colliders:静态碰撞体数量。不随时间移动的 Collider(没有 Rigidbody 组件)的数量。它们不会触发物理运算,但对碰撞查询仍有负担
  • Rigidbody:场景中存在的刚体总数。所有带 Rigidbody 的对象数量,包括动态和运动学刚体,不区分是否活跃
  • Trigger Overlaps:触发器重叠事件总数。所有 isTrigger = true 的 Collider 之间、或 Trigger 与刚体之间本帧发生的重叠事件数量。用于触发 OnTriggerEnter/Exit/Stay 等脚本回调
  • Active Constraints:活跃的物理约束数量。当前物理系统中处于活动状态的 Constraints(如 FixedJoint、HingeJoint 等连接组件)数量。用于连接多个刚体的链式结构、关节等。约束计算较重,需关注数量
  • Contacts:当前帧中检测到的接触点总数。所有 Collider 间的物理接触点总数(即 OnCollision… 会被触发的接触)。表示物理引擎本帧精确处理了多少碰撞点

Physics对于我们的意义

Physics(物理学)模块可以帮助我们:

  1. 排查是否有未释放的物理对象(内存泄露)
    关注:Physics Used Memory(物理系统使用内存)、Dynamic Bodies(动态刚体数量)。观察物理内存是否持续增长,是否及时销毁不再使用的对象

  2. 排查是否物理模拟压力过大(游戏卡顿、掉帧、场景中物理资源太多)
    关注:Active Dynamic Bodies(活动中的动态刚体数量)。降低动态刚体数量,或分批激活

  3. 排查 Trigger 性能瓶颈(动画或角色互动异常)
    关注:Trigger Overlaps(触发器和刚体之间的重叠数量)。合理使用 Trigger 区域,避免频繁进入 / 退出

  4. 排查物理查询是否过多(查询性能异常)
    关注:Physics Queries(物理查询数)。优化射线和物理查询逻辑,限制帧内调用次数

  5. 排查平台差异性
    对比不同设备对物理性能的影响(低端机上尤为重要)

  6. 等等

总之,该模块可以帮助我们进行性能和内存问题定位,提供优化思路、分析平台差异性等等。


15.2 知识点代码

Lesson15_Unity性能分析工具_Profiler窗口Physics.cs

public class Lesson15_Unity性能分析工具_Profiler窗口Physics
{
    #region 知识点一 Physics是什么

    /*
     * Physics(物理学)模块
     * - 专门用于监控物理系统(3D 物理)运行状态与性能开销的工具
     * - 涵盖了 Rigidbody、Collider、碰撞检测、物理查询等运行时数据
     * - 主要帮助我们排查 3D 物理相关问题
     *
     * 在游戏中如果出现以下问题时,可以着重观察这里的内容:
     * 1. 碰撞相关逻辑不触发
     * 2. 性能异常抖动(可能是物理计算量太大)
     * 3. 射线检测变慢
     * 4. 物理不稳定
     * 等等
     *
     * 总结:几乎所有和 3D 物理相关的问题,我们都可以通过该模块进行排查
     */

    #endregion

    #region 知识点二 Physics中各参数功能的含义和作用

    /*
     * 界面参数功能:
     * - 在思维导图中讲解
     */

    #endregion

    #region 知识点三 Physics对于我们的意义

    /*
     * Physics(物理学)模块可以帮助我们:
     *
     * 1. 排查是否有未释放的物理对象(内存泄露)
     *    - 关注:Physics Used Memory(物理系统使用内存)、Dynamic Bodies(动态刚体数量)
     *    - 观察物理内存是否持续增长,是否及时销毁不再使用的对象
     *
     * 2. 排查是否物理模拟压力过大(游戏卡顿、掉帧、场景中物理资源太多)
     *    - 关注:Active Dynamic Bodies(活动中的动态刚体数量)
     *    - 降低动态刚体数量,或分批激活
     *
     * 3. 排查 Trigger 性能瓶颈(动画或角色互动异常)
     *    - 关注:Trigger Overlaps(触发器和刚体之间的重叠数量)
     *    - 合理使用 Trigger 区域,避免频繁进入 / 退出
     *
     * 4. 排查物理查询是否过多(查询性能异常)
     *    - 关注:Physics Queries(物理查询数)
     *    - 优化射线和物理查询逻辑,限制帧内调用次数
     *
     * 5. 排查平台差异性
     *    - 对比不同设备对物理性能的影响(低端机上尤为重要)
     *
     * 等等
     *
     * 总结:该模块可以帮助我们进行性能和内存问题定位,提供优化思路、分析平台差异性等等
     */

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏