UPL2-10——Physics (2D) 模块

2D 物理相关,详见:U3L9——2D物理系统

Physics (2D) 模块

Physics (2D)(2D物理学)模块是专门用于分析和排查 2D 物理系统(基于 Box2D 引擎) 的性能与行为的工具

主要帮助我们排查 2D 物理相关问题,使用 2D 物理系统制作的各类型游戏都可以使用该模块来分析排查问题

Physics(2D)中各参数功能的含义和作用

image

  • 2D 物理学(Physics 2D)性能检测窗口

    image

    • Total Contacts:总接触点数

      当前帧中发生接触的 2D 碰撞点数量(如 OnCollisionEnter2D 所对应的接触点)
      值高说明有很多碰撞交互,可能带来性能开销。

    • Total Shapes:总碰撞形状数

      场景中所有的 Collider2D​ 组件数(如 BoxCollider2D​、CircleCollider2D 等)
      用于评估物理形状规模

    • Total Queries:总查询次数

      这一帧中所有 2D 物理查询次数(如 Physics2D.Raycast​, OverlapCircle​, BoxCast 等)
      值过高代表代码中有大量物理检测,可能是性能瓶颈

    • Total Callbacks:总回调次数

      本帧中触发的 2D 物理回调事件数量,如 OnCollisionEnter2D​、OnTriggerEnter2D​、OnJointBreak2D

    • Total Joints:总关节数

      当前场景中存在的所有 Joint2D​(如 HingeJoint2D​、SpringJoint2D 等)组件数量
      值越高,物理系统连接关系越复杂。

    • Total Bodies:总刚体数

      所有存在的 Rigidbody2D 数量(无论是否激活)
      可以快速评估 2D 物理世界的规模

    • Awake Bodies:唤醒的刚体数量

      当前处于活跃状态、正在参与物理计算的 Rigidbody2D​ 数量(即未 Sleep() 的)。

    • Dynamic Bodies:动态刚体数量

      Rigidbody2D.bodyType = Dynamic 的对象数量
      会受到力、碰撞、重力影响。

    • Continuous Bodies:连续检测刚体数

      启用了连续碰撞检测(CollisionDetectionMode2D.Continuous)的刚体数量。
      用于防止高速穿透,但性能消耗较大。

    • Physics Used Memory (2D):2D 物理系统使用的总内存

      包括所有刚体、碰撞器、关节、缓存等 Box2D 系统占用的内存
      可用于分析是否有未释放的资源或超大结构。

  • Current 当前的信息窗口

    image

    • Physics Used Memory(物理系统使用的内存)

      • Total:当前 2D 物理系统(Box2D 引擎)使用的内存总量
      • Relative:占整个应用程序内存的百分比
    • Bodies(刚体)/ Shapes(碰撞体)

      • Total: Rigidbody2D 存在数量
      • Awake:唤醒状态的刚体
      • Asleep:休眠状态的刚体
      • Dynamic / Kinematic / Static:动态 / 运动学 / 静态刚体数量
      • Discrete / Continuous:启用离散或连续碰撞检测的刚体数量
    • Queries(物理查询)

      • Raycasts:射线检测次数
      • ShapeCast:图形投射次数
      • Overlap:重叠检测次数(如 OverlapBox2D
      • IsTouching / GetContacts / Particle:查询碰撞接触或粒子系统交互
    • Contacts(接触点)

      • Broadphase Updates / Pairs:广义碰撞检测
      • Total / Added / Removed:碰撞总量/开始接触/结束接触
    • Callbacks(回调)

      • Total:总触发事件数量
      • Collision Enter / Stay / Exit:触发 OnCollisionEnter2D 等回调数量
      • Trigger Enter / Stay / Exit:触发 Trigger 回调事件数量
    • Solver(求解器)

      • World Count:物理世界存在数量(即 PhysicsScene2D
      • Simulation Count:有多少刚体参与模拟
      • Discrete Islands / Continuous Islands:离散/连续物理模拟孤岛数量
    • Transform Sync(变换同步)

      • Sync Calls:transform​ 同步操作(即 Transform​ 到 Rigidbody2D 的位置同步)
      • Sync Bodies / Colliders:同步的刚体和碰撞体数
      • Parent Sync Colliders:父子同步数量
    • Joints(关节)

      • Total:关节总数
    • Timings(耗时)

      • Sim:模拟耗时
      • Sync:同步耗时
      • Step:模拟步进耗时
      • Write:写入回调数据耗时
      • Callbacks:触发回调耗时
  • Legacy 旧版信息窗口

    可以忽略,当前的信息窗口更加详细(下方详细信息窗口无内容)

    image

    • Total Bodies:刚体总数

      场景中所有的 Rigidbody2D 数量,无论状态(活跃/休眠/动态/静态)

    • Active Bodies:活跃刚体数

      当前处于唤醒状态、正在参与物理模拟的 Rigidbody2D 数量

    • Sleeping Bodies:休眠刚体数

      当前处于休眠状态的刚体(不参与模拟,直到外力或碰撞唤醒)

    • Dynamic Bodies:动态刚体数

      Rigidbody2D.bodyType = Dynamic 的对象数,会受力、重力、碰撞影响

    • Kinematic Bodies:运动学刚体数

      bodyType = Kinematic 的刚体,不受物理力影响,通常由代码控制位置移动

    • Static Bodies:静态刚体数

      实际上是没有附加 Rigidbody2D​ 的 Collider2D 数量,视为静态体存在参与碰撞检测,但不移动

    • Contacts:当前接触点数

      本帧中所有 2D 刚体间的接触点数量(不区分 Enter/Stay/Exit),数量过多会增加求解压力

Physics(2D)对于我们的意义

它可以帮助我们排查:

  1. 是否有大量碰撞?(影响性能)

    关注:Total Contacts、Total Callbacks

  2. 是否频繁查询物理?(影响性能)

    关注:Total Queries

  3. 刚体是否过多?(影响性能)

    关注:Total Bodies、Awake Bodies、Dynamic Bodies

  4. 使用了多少连续碰撞检测?(影响性能)

    关注:Continuous Bodies(建议仅用于子弹、快速移动体)

  5. 内存是否异常?

    关注:Physics Used Memory(2D)(持续上升说明内存泄漏或资源未释放)

  6. Total Queries(查询总数) 很高

    可能原因:每帧大量 Raycast / Overlap2D
    建议:合并检测逻辑、加帧间隔、限制 Layer

  7. Total Callbacks(总回调次数) 很高

    可能原因:触发器 / 碰撞回调过多
    建议:合并 Collider 区域、优化触发条件

  8. Continuous Bodies(连续监测刚体) 很高

    可能原因:连续检测滥用
    建议:只给高速刚体启用 Continuous 模式

  9. Total Shapes(形状总数) 极多

    可能原因:拆分成太多 Collider2D
    建议:合并静态物体碰撞体,如背景、地形等

  10. Physics Used Memory(总内存分配) 持续上升

    可能原因:未释放碰撞体或刚体
    建议:检查动态创建对象是否被销毁

总之,该模块可以帮助我们快速定位 2D 物理瓶颈、验证物理逻辑是否正确触发、分析平台差异性等等