58.3D物理系统基础设置

58.性能优化-CPU-物理-3D物理系统基础设置


58.1 知识点

为什么要学习物理系统基础设置

可以在 Project Settings 中对物理系统进行基础设置。
这些设置看起来只与物理相关,但很多参数会直接影响性能。
了解这些基础设置,有助于进行性能优化。

解算器是什么

解算器(Solver)在 Unity 物理系统中,是物理引擎里负责求解方程的模块,用于处理碰撞、关节约束。
它决定物体接触后如何调整位置和速度。迭代次数越多越稳定,CPU 开销也越大。

碰撞检测只负责发现物体 A 和 B 重叠或接触,接下来需要处理:

  1. 它们应分开多少?
  2. 速度、角速度如何调整?

这会涉及多种约束:

  1. 碰撞不允许重叠,需要位置约束
  2. 摩擦、弹性系数要生效,需要速度约束
  3. 关节要维持结构,需要关节约束

这些约束本质上是线性方程和不等式,解算器负责求解,得到新的位置和速度。

解算器在 Unity 中的工作流程:

  • 输入: 碰撞检测生成的 Contact Pairs、关节约束、Rigidbody 的质量/惯性/速度/力等
  • 过程: 按算法迭代求解(近似解),每次迭代使位置和速度更接近符合物理规律
  • 输出: 更新后的 Rigidbody 位置、旋转、速度、角速度

Unity 中的 3D 物理系统基础设置

基础参数

  1. Default Material(默认材质)
    设置默认物理材质。Collider 未指定材质时使用。物理材质决定摩擦、弹性等。
  2. Bounce Threshold(反弹阈值)
    相对速度小于该值的碰撞不触发弹性反弹,避免低速抖动。
  3. Default Max Depenetration Velocity(默认最大脱离速度)
    物体重叠时,物理引擎会将其推开。该值限制推出的最大速度,防止过快弹飞。
  4. Sleep Threshold(休眠阈值)
    刚体速度(线性 + 角速度)低于该值时进入休眠,减少计算。
  5. Default Contact Offset(默认接触偏移量)
    碰撞体周围的额外“皮肤”厚度。值越大越早检测到接触(避免高速漏检),过大可能导致不必要碰撞。

解算器相关

  1. Default Solver Iterations(默认解算器迭代次数)
    每次物理步长内解算器的迭代次数,影响位置/旋转的精度和稳定性。越高越稳定但更耗 CPU。
  2. Default Solver Velocity Iterations(默认解算器速度迭代次数)
    专门用于解算速度的迭代次数,主要影响摩擦、反弹的稳定性。

碰撞检测配置

  1. Queries Hit Backfaces(查询命中背面)
    Raycast 是否检测 MeshCollider 背面。关掉通常更高效。
  2. Queries Hit Triggers(查询命中触发器)
    Raycast 是否检测触发器(isTrigger 的 Collider)。
  3. Enable Adaptive Force(启用自适应力)
    动态调节接触力以稳定堆叠物体,通常保持关闭。

模拟模式

Simulation Mode(模拟模式)
Unity 物理引擎每帧需要推进物理世界一次(即调用 Physics.Simulate)。Simulation Mode 控制该物理步进由谁执行。

  1. Fixed Update
    物理模拟在 FixedUpdate 中自动执行,由 Time > Fixed Timestep 控制。独立于渲染帧率,即使渲染卡顿也会按固定步长补模拟。
    优点:稳定、一致,适合大多数游戏。
    缺点:掉帧时可能出现多次物理步进,造成 CPU 峰值。
  2. Update
    物理模拟在每帧 Update 中执行,跟随渲染帧率。
    优点:物理与画面同步,适合对物理依赖较少的项目。
    缺点:帧率不稳定时物理会抖动。
  3. Script
    Unity 不再自动更新物理,需在代码中调用 Physics.Simulate(deltaTime)
    用于:自写物理、多场景物理不同步、回放系统等。
    优点:可控性强。
    缺点:管理复杂度高,容易出错。

示例:Script 模式下手动调用物理模拟

// 在 Simulation Mode 为 Script 时手动推进物理
void Update()
{
    Physics.Simulate(Time.deltaTime);
}

其他参数

  1. Auto Sync Transforms(是否自动同步转换)
    为 true 时,每次修改 Transform 都会自动同步到物理引擎,性能代价高。推荐关闭,用 Rigidbody.MovePositionMoveRotation 控制移动。
  2. Reuse Collision Callbacks(是否复用碰撞回调)
    是否复用 Collision 对象以减少 GC。推荐开启。
  3. Invoke Collision Callbacks(是否调用碰撞回调函数)
    是否触发 OnCollisionEnter / Stay / Exit。关闭时回调不触发,但物理仍然计算。

接触对和广义检测

Contact Pairs Mode(接触对配对模式)
当两个 Collider 的 AABB 在 Broadphase 阶段重叠时,PhysX 会将其作为候选对送入 Narrowphase。
Narrowphase 确认接触后生成 Contact Pair,包含:两个 Collider、接触点位置/法线/穿透深度、是否触发器、是否涉及 CCD 等。
Contact Pair 决定碰撞解算和回调(OnCollisionXXX / OnTriggerXXX)的触发。

  1. Default Contact Pairs(默认接触对)
    只生成必要的接触对。
  2. Enable Kinematic Kinematic Pairs(启用运动学接触对)
    默认 Kinematic vs Kinematic 不生成接触对。开启后也会生成,用于检测两个运动学物体的触发事件,但会增加 Broadphase/Narrowphase 处理量。
  3. Enable Kinematic Static Pairs(启用运动学静态接触对)
    默认 Kinematic vs Static 不生成。开启后可用于检测运动学物体(如移动平台)是否接触静态场景,但会增加 Pair 数量和开销。
  4. Enable All Contact Pairs(生成所有可能的接触对)
    包含触发器、CCD、运动学刚体等。通常用于调试,性能消耗最高。

Broadphase Type(广义检测类型)

  1. Sweep And Prune(SAP)
    默认,基于轴排序,高效。
  2. Automatic Box Pruning
    适合超大场景,Unity 内部实验功能。

摩擦和精度

Friction Type(摩擦类型)

  1. Patch Friction Type(补块摩擦类型)
    在接触点块里球平均值。
  2. One Directional / Two Directional Friction(单向/双向摩擦)
    更精确或更快的选项,影响摩擦模拟,消耗更大。

其他选项:

  • Enable Enhanced Determinism(启用增强确定性)
    物理计算更确定性(跨平台一致),有性能开销。
  • Improved Patch Friction(改进后的补块摩擦计算)
    优化摩擦模型,提高堆叠稳定性,有性能开销。

解算器类型

Solver Type(解算器类型)

  1. Projected Gauss Seidel(PGS)
    PhysX 默认解算器,效率高但数值不完全稳定。
  2. Temporal Gauss Seidel(TGS)
    Unity 2019+ 引入,更稳定(尤其关节/堆叠),但更耗性能。

速度、缓存、阈值

  1. Default Max Angular Speed(默认最大角速度)
    刚体最大角速度,防止旋转过快导致数值不稳定。
  2. Scratch Buffer Chunk Count(临时缓冲区块计数)
    物理一次模拟可用的临时内存块数。通常保持默认。大规模物理场景(上万刚体、大量接触点)可适当调高。
    太小会导致 PhysX 频繁申请内存,造成性能抖动和 GC 压力;太大占用多余内存但换来更稳定性能。
    可用 Profiler 查看物理模块的内存分配峰值,若频繁分配则增大。
  3. Fast Motion Threshold(快速运动阈值)
    物体运动超过该阈值时,强制使用连续碰撞检测以防漏检。默认值极大,相当于关闭。

58.2 知识点代码

Lesson58_性能优化_CPU_物理_3D物理系统基础设置.cs

public class Lesson58_性能优化_CPU_物理_3D物理系统基础设置
{
    #region 知识点一 为什么要学习物理系统基础设置

    //我们可以在Project Settings中对物理系统进行一些基础设置
    //这些设置看起来只是和物理系统有关,但是实际上其中的很多参数
    //都会实实在在的影响我们的性能
    //因此,了解这些基础设置,对于我们优化性能也会有一定的帮助!

    #endregion

    #region 知识点二 解算器是什么

    //解算器(Solver)在 Unity 物理系统里其实是指
    //物理引擎里负责解方程的模块
    //就是 Unity 物理里用来处理碰撞、关节约束的方程求解器
    //它决定物体在发生接触后该怎么调整位置和速度
    //迭代次数越多越稳定,代价是 CPU 更高

    //在物理模拟里,碰撞检测只是 发现物体 A 和物体 B 重叠或接触
    //接下来要处理两个问题
    //1.它们该分开多少?
    //2.它们的速度、角速度要怎么调整?
    //这就涉及到一堆约束条件:
    //1.碰撞不允许重叠,需要位置约束
    //2.摩擦、弹性系数要生效,需要速度约束
    //3.关节要维持结构,需要关节约束
    //这些约束本质上会形成 一组线性方程和不等式,解算器就是负责解这些方程,求出新的位置和速度

    //举例:
    //解算器在 Unity 中的作用
    //输入信息:
    //1.碰撞检测生成的接触点(Contact Pairs)
    //2.所有关节约束
    //3.Rigidbody 的质量、惯性、速度、力
    //等等

    //过程:
    //按一定算法迭代求解(近似解,而不是数学上的精确解)
    //每迭代一次,位置和速度更接近符合物理规律的状态

    //输出:
    //更新后的 Rigidbody 的位置、旋转、速度、角速度

    #endregion

    #region 知识点三 Unity中的3D物理系统基础设置相关

    //思维导图中讲解

    #endregion
}


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

×

喜欢就点赞,疼爱就打赏