16.Profiler窗口Physics2D

16.Unity性能分析工具-Profiler窗口Physics2D


16.1 知识点

Physics(2D)是什么

Physics(2D)(2D 物理学)模块是专门用于分析和排查 2D 物理系统(基于 Box2D 引擎)的性能与行为的工具,主要帮助我们排查 2D 物理相关问题。

使用 2D 物理系统制作的各类型游戏都可以使用该模块来分析排查问题。

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

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

  • 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 系统占用的内存。可用于分析是否有未释放的资源或超大结构

当前的信息窗口

  • 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(回调)

    • 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(关节)

  • Timings(耗时)

    • Sim:模拟耗时
    • Sync:同步耗时
    • Step:模拟步进耗时
    • Write:写入回调数据耗时
    • Callbacks:触发回调耗时

遗留信息窗口(老版本)

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

  • 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 物理瓶颈、验证物理逻辑是否正确触发、分析平台差异性等等。


16.2 知识点代码

Lesson16_Unity性能分析工具_Profiler窗口Physics2D.cs

public class Lesson16_Unity性能分析工具_Profiler窗口Physics2D
{
    #region 知识点一 Physics(2D)是什么

    /*
     * Physics(2D)(2D 物理学)模块
     * - 专门用于分析和排查 2D 物理系统(基于 Box2D 引擎)的性能与行为的工具
     * - 主要帮助我们排查 2D 物理相关问题
     *
     * 使用 2D 物理系统制作的各类型游戏都可以使用该模块来分析排查问题
     */

    #endregion

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

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

    #endregion

    #region 知识点三 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 物理瓶颈、验证物理逻辑是否正确触发、分析平台差异性等等
     */

    #endregion
}


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

×

喜欢就点赞,疼爱就打赏