UPL2-9——Physics 模块

关于物理模块相关,详见:U1L13——物理系统碰撞体相关,U2L13——物理系统范围和射线检测相关

Physics 模块

Physics(物理学)模块是专门用于监控 物理系统(3D 物理)运行状态与性能开销 的工具,它涵盖了 Rigidbody​、Collider、碰撞检测、物理查询等运行时数据
主要帮助我们排查 3D 物理相关问题,在游戏中如果出现以下问题时,可以着重观察这里的内容:

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

等等

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

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

image

  • 物理学(Physics)分析窗口

    image

    • 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:本帧中所有物理查询的调用次数(如 射线检测、范围检测 等)

      频繁的物理查询是物理系统性能瓶颈的重要来源,过多需优化

  • Current 当前的信息窗口

    image

    • Physics Used Memory:当前物理系统使用的总内存量(包括碰撞体、刚体、内部缓存等)

      如果持续上升或占用过高,可能存在碰撞体未销毁或分配过多的问题

    • Dynamic Bodies:所有存在的动态刚体数量(包括非活动的)

      用于判断是否创建了过多物理对象、未及时销毁

    • Articulation Bodies:关节刚体数量,表示场景中启用了 ArticulationBody(关节体) 的对象个数

      此类刚体通常用于高级机器人结构或物理链式系统。相比普通 Rigidbody 开销大,慎用!
      如果数量太大(上百个),说明使用过多,建议减少数量

    • Active Dynamic Bodies:当前活动中的动态刚体(Rigidbody)数量(受力、移动、正在计算中)

      是物理运算的主要开销来源,数量越多计算世界越长

    • Active Kinematic Bodies:当前活动中的运动学刚体(isKinematic = true)数量

      虽不受物理驱动,但仍会影响碰撞检测,数量多时也有开销

    • Static Colliders:静态碰撞体数量(无 Rigidbody Collider

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

    • Colliders Synced:本帧同步到物理系统的碰撞体数量

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

    • Rigidbodies Synced:本帧同步到物理系统的刚体数量

      频繁设置 transform.position​ 或修改 velocity 都会触发同步,尤其在大批量刚体上影响显著
      尽量使用刚体加力的形式让对象移动

    • Physics Queries:本帧中所有物理查询的调用次数(如 射线检测、范围检测 等)

      频繁的物理查询是物理系统性能瓶颈的重要来源,过多需优化

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

      • Discreet:离散检测重叠数

        正常游戏中这一项会是最多的

      • Continuous:连续检测重叠数

        建议仅对高速移动物体(如子弹、快速飞行物)使用连续检测,其它物体请用 Discrete

      • Trigger:触发器重叠次数

        尽量避免重叠区域之间反复进入退出

      • Modified:修改过的碰撞体参与的重叠次数

        在本帧中修改过的碰撞体(如大小、位置、开关状态等)所参与的重叠检测次数
        这类操作通常会强制 Unity 更新碰撞体树结构,产生额外开销

    • Broadphase Adds/Removes:广义阶段的添加和移除

      广义阶段:用来快速判断哪些物体“可能发生碰撞”,通常使用 包围盒(AABB) 进行粗略检测,性能消耗低、处理大批量对象的效率高

      • Adds:本帧中,被添加到物理世界中、需要参与碰撞检测的新对象(或更新后重新注册的对象)数量

        例如:新创建了一个带 Collider 的物体,或修改了碰撞体的位置/尺寸等

      • Removes:本帧中,被从 Broadphase 系统中移除的碰撞体数量

        例如:销毁了对象、禁用了 Collider、将其移出物理世界

      关注点:

      • 当 Adds 和 Removes 只有0~几十个时是正常范围
      • 若 Adds 和 Removes 达到几百以上,需要关注,可能存在频繁修改或销毁碰撞体的逻辑
      • 若 Adds 和 Removes 达到上千甚至持续增长,则说明严重性能问题,建议重点优化对象生命周期管理
    • Narrowphase Adds/Removes:狭义阶段的添加和移除

      狭义阶段:对 Broadphase 结果中的物体做更精确的碰撞计算(如 Mesh​ vs. Capsule),开销大,但只处理可能碰撞的对象

      • New:新增精确碰撞对数量

        表示本帧中,首次发生精确碰撞检测的物体对数量。也就是两个 Collider 首次接触,需要进入精确计算流程

      • Lost:丢失精确碰撞对数量

        表示本帧中,不再发生碰撞的物体对数量。也就是上一帧接触,本帧分离,因此这个“碰撞对”失效了

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

      关注点:

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

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

    image

    • 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. 排查平台差异性

    对比不同设备对物理性能的影响(低端机上尤为重要)

等等

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