58.性能优化-CPU-物理-3D物理系统基础设置
58.1 知识点
为什么要学习物理系统基础设置
可以在 Project Settings 中对物理系统进行基础设置。
这些设置看起来只与物理相关,但很多参数会直接影响性能。
了解这些基础设置,有助于进行性能优化。
解算器是什么
解算器(Solver)在 Unity 物理系统中,是物理引擎里负责求解方程的模块,用于处理碰撞、关节约束。
它决定物体接触后如何调整位置和速度。迭代次数越多越稳定,CPU 开销也越大。
碰撞检测只负责发现物体 A 和 B 重叠或接触,接下来需要处理:
- 它们应分开多少?
- 速度、角速度如何调整?
这会涉及多种约束:
- 碰撞不允许重叠,需要位置约束
- 摩擦、弹性系数要生效,需要速度约束
- 关节要维持结构,需要关节约束
这些约束本质上是线性方程和不等式,解算器负责求解,得到新的位置和速度。
解算器在 Unity 中的工作流程:
- 输入: 碰撞检测生成的 Contact Pairs、关节约束、Rigidbody 的质量/惯性/速度/力等
- 过程: 按算法迭代求解(近似解),每次迭代使位置和速度更接近符合物理规律
- 输出: 更新后的 Rigidbody 位置、旋转、速度、角速度
Unity 中的 3D 物理系统基础设置

基础参数
- Default Material(默认材质)
设置默认物理材质。Collider 未指定材质时使用。物理材质决定摩擦、弹性等。 - Bounce Threshold(反弹阈值)
相对速度小于该值的碰撞不触发弹性反弹,避免低速抖动。 - Default Max Depenetration Velocity(默认最大脱离速度)
物体重叠时,物理引擎会将其推开。该值限制推出的最大速度,防止过快弹飞。 - Sleep Threshold(休眠阈值)
刚体速度(线性 + 角速度)低于该值时进入休眠,减少计算。 - Default Contact Offset(默认接触偏移量)
碰撞体周围的额外“皮肤”厚度。值越大越早检测到接触(避免高速漏检),过大可能导致不必要碰撞。
解算器相关
- Default Solver Iterations(默认解算器迭代次数)
每次物理步长内解算器的迭代次数,影响位置/旋转的精度和稳定性。越高越稳定但更耗 CPU。 - Default Solver Velocity Iterations(默认解算器速度迭代次数)
专门用于解算速度的迭代次数,主要影响摩擦、反弹的稳定性。
碰撞检测配置
- Queries Hit Backfaces(查询命中背面)
Raycast 是否检测 MeshCollider 背面。关掉通常更高效。 - Queries Hit Triggers(查询命中触发器)
Raycast 是否检测触发器(isTrigger的 Collider)。 - Enable Adaptive Force(启用自适应力)
动态调节接触力以稳定堆叠物体,通常保持关闭。
模拟模式
Simulation Mode(模拟模式)
Unity 物理引擎每帧需要推进物理世界一次(即调用 Physics.Simulate)。Simulation Mode 控制该物理步进由谁执行。

- Fixed Update
物理模拟在FixedUpdate中自动执行,由Time > Fixed Timestep控制。独立于渲染帧率,即使渲染卡顿也会按固定步长补模拟。
优点:稳定、一致,适合大多数游戏。
缺点:掉帧时可能出现多次物理步进,造成 CPU 峰值。 - Update
物理模拟在每帧Update中执行,跟随渲染帧率。
优点:物理与画面同步,适合对物理依赖较少的项目。
缺点:帧率不稳定时物理会抖动。 - Script
Unity 不再自动更新物理,需在代码中调用Physics.Simulate(deltaTime)。
用于:自写物理、多场景物理不同步、回放系统等。
优点:可控性强。
缺点:管理复杂度高,容易出错。
示例:Script 模式下手动调用物理模拟
// 在 Simulation Mode 为 Script 时手动推进物理
void Update()
{
Physics.Simulate(Time.deltaTime);
}
其他参数
- Auto Sync Transforms(是否自动同步转换)
为 true 时,每次修改 Transform 都会自动同步到物理引擎,性能代价高。推荐关闭,用Rigidbody.MovePosition或MoveRotation控制移动。 - Reuse Collision Callbacks(是否复用碰撞回调)
是否复用 Collision 对象以减少 GC。推荐开启。 - Invoke Collision Callbacks(是否调用碰撞回调函数)
是否触发OnCollisionEnter/Stay/Exit。关闭时回调不触发,但物理仍然计算。
接触对和广义检测
Contact Pairs Mode(接触对配对模式)
当两个 Collider 的 AABB 在 Broadphase 阶段重叠时,PhysX 会将其作为候选对送入 Narrowphase。
Narrowphase 确认接触后生成 Contact Pair,包含:两个 Collider、接触点位置/法线/穿透深度、是否触发器、是否涉及 CCD 等。
Contact Pair 决定碰撞解算和回调(OnCollisionXXX / OnTriggerXXX)的触发。

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

- Sweep And Prune(SAP)
默认,基于轴排序,高效。 - Automatic Box Pruning
适合超大场景,Unity 内部实验功能。
摩擦和精度
Friction Type(摩擦类型)

- Patch Friction Type(补块摩擦类型)
在接触点块里球平均值。 - One Directional / Two Directional Friction(单向/双向摩擦)
更精确或更快的选项,影响摩擦模拟,消耗更大。
其他选项:
- Enable Enhanced Determinism(启用增强确定性)
物理计算更确定性(跨平台一致),有性能开销。 - Improved Patch Friction(改进后的补块摩擦计算)
优化摩擦模型,提高堆叠稳定性,有性能开销。
解算器类型
Solver Type(解算器类型)

- Projected Gauss Seidel(PGS)
PhysX 默认解算器,效率高但数值不完全稳定。 - Temporal Gauss Seidel(TGS)
Unity 2019+ 引入,更稳定(尤其关节/堆叠),但更耗性能。
速度、缓存、阈值
- Default Max Angular Speed(默认最大角速度)
刚体最大角速度,防止旋转过快导致数值不稳定。 - Scratch Buffer Chunk Count(临时缓冲区块计数)
物理一次模拟可用的临时内存块数。通常保持默认。大规模物理场景(上万刚体、大量接触点)可适当调高。
太小会导致 PhysX 频繁申请内存,造成性能抖动和 GC 压力;太大占用多余内存但换来更稳定性能。
可用 Profiler 查看物理模块的内存分配峰值,若频繁分配则增大。 - 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