59.性能优化-CPU-物理-2D物理系统基础设置
59.1 知识点
Unity 中的 2D 物理系统基础设置

常规设置
- Gravity(重力)
设置 2D 世界中的重力方向和大小,默认为朝下的重力。 - Default Material(默认物理材质)
无材质时的默认 2D 物理材质(Physics Material 2D)。
解算相关
Velocity Iterations(速度迭代次数)
数值越高,碰撞时速度计算越精确,但性能消耗更大。Position Iterations(位置迭代次数)
影响碰撞中位置校正的精度。Bounce Threshold(反弹阈值)
低于此速度的碰撞不产生弹性反弹,避免小抖动。Max Linear Correction(最大线性位置修正)
防止物体因浮点误差穿透时的修正量。Max Angular Correction(最大角度修正)
同上,针对旋转。Max Translation Speed(最大线速度)
防止物体速度过大导致物理计算不稳定。Max Rotation Speed(最大角速度)
防止角速度过大导致不稳定。
修正量是什么
由于浮点误差、大时间步长或高速运动,物体可能发生轻微重叠。
Box2D 的解算器通过位置校正将物体推开,避免无限重叠。
若“推开量”没有限制,可能在一次迭代中把物体推出很远导致抖动,或使高速/薄物体瞬移到异常位置。
因此 Box2D 提供两个安全阈值,限制一次迭代中线性位置和旋转修正的最大距离。
举例:两个刚体重叠 0.5 米,Max Linear Correction = 0.2 时,引擎一次迭代最多修正 0.2 米,可能需要多次迭代逐步分开。
若将该值调大(如 1),一次迭代可能修正 0.5 米,但可能导致物体瞬间弹开,不稳定。
穿透修正相关
- Baumgarte Scale(位置修正系数)
控制碰撞时穿透误差的修正比例,表现为温和推开。 - Baumgarte Time Of Impact Scale(TOI 修正系数)
主要用于高速物体的连续碰撞检测,表现为更强推开,因高速物体必须尽快分离。
举例:两个物体重叠 0.1m。
Baumgarte Scale = 0.2 时,每次迭代修正 0.02m,约需 5 次迭代分离。
Baumgarte TOI Scale = 0.75 时,每次修正 0.075m,约 2 次迭代即可分离,主要用于 CCD 物体。
休眠相关
- Time To Sleep(睡眠延迟)
进入休眠前的延迟时间。 - Linear Sleep Tolerance(线性睡眠耐受力)
线速度低于该值时物体可进入休眠。 - Angular Sleep Tolerance(角速度睡眠耐受力)
角速度低于该值时物体可进入休眠。
射线、碰撞检测相关
- Default Contact Offset(默认接触偏移量)
减小浮点误差导致的穿透。 - Contact Threshold(接触阈值)
主要用于 CCD(连续碰撞检测)。 - Queries Hit Triggers(查询命中触发器)
射线检测是否检测触发器。 - Queries Start In Colliders(查询从碰撞器开始)
射线起点在 Collider 内时是否算命中。 - Callbacks On Disable(禁用回调)
对象禁用时是否触发碰撞回调。 - Reuse Collision Callbacks(重用碰撞回调)
是否重用碰撞回调对象以减少 GC。
模拟模式
Auto Sync Transforms(是否自动同步转换)
为 true 时,每次修改 Transform 都会同步到物理引擎,性能代价高。推荐关闭,用Rigidbody2D.MovePosition或MoveRotation控制移动。Simulation Mode(模拟模式)
Unity 每帧需推进物理世界一次(即调用Physics2D.Simulate)。Simulation Mode 控制该物理步进由谁执行。
- Fixed Update
物理模拟在FixedUpdate中自动执行,由Time > Fixed Timestep控制。独立于渲染帧率。
优点:稳定、一致,适合大多数游戏。
缺点:掉帧时可能出现多次物理步进,造成 CPU 峰值。 - Update
物理模拟在每帧Update中执行,跟随渲染帧率。
优点:物理与画面同步,适合对物理依赖较轻的项目。
缺点:帧率不稳定时物理会抖动。 - Script
Unity 不再自动更新物理,需在代码中调用Physics2D.Simulate(deltaTime)。
用于自写物理、多场景物理不同步、回放系统等。
优点:可控性强。
缺点:管理复杂度高,容易出错。
- Fixed Update
Simulation Layers(模拟层)
控制哪些 Layer 参与物理模拟。
调试相关
Gizmos(小工具)
控制编辑器中如何绘制碰撞体:
- Nothing:不显示任何 2D 物理 Gizmos
- Everything:显示所有可用的 Collider Gizmos
- All Colliders:显示场景中所有 2D Collider
- Colliders Outlined:显示碰撞体轮廓线,便于检查形状
- Colliders Filled:显示碰撞体填充区域,便于区分重叠
- Colliders Sleeping:高亮处于休眠状态的刚体碰撞体,便于调试性能
- Collider Contacts:显示碰撞体之间的接触点
- Collider Bounds:显示碰撞体包围盒(AABB)
多线程相关
Use Multithreading(使用多线程)
启用 2D 物理的多线程 Job 系统,物理运算会分配到多个 CPU 核心。
Use Consistency Sorting(启用一致性排序)
保证任务执行顺序可预测。关闭会更快,但可能出现非确定性结果。
Job 分批参数
控制各种物理计算任务(插值、接触生成、清理等)如何分批给 Job。
数值越大 = Job 数量少(减少调度开销,单 Job 任务重)。
数值越小 = Job 数量多(更分散,可利用更多线程,但调度开销大)。
- Interpolation Poses Per Job:插值姿态计算时,每个 Job 处理的刚体数量
- New Contacts Per Job:每个 Job 处理的新接触点数量
- Collide Contacts Per Job:碰撞检测中,每个 Job 处理的接触数
- Clear Flags Per Job:清理物体标记时,每个 Job 批处理的数量
- Clear Body Forces Per Job:清理刚体受力时,每个 Job 处理的刚体数
- Sync Discrete Fixtures Per Job:离散碰撞体同步时,每个 Job 的数量
- Sync Continuous Fixtures Per Job:连续碰撞体(CCD)同步时,每个 Job 的数量
- Find Nearest Contacts Per Job:查找最近接触点时,每个 Job 的数量
- Update Trigger Contacts Per Job:更新触发器接触点时,每个 Job 的数量
岛屿解算器相关
物理系统会把一组相互作用的刚体、关节、碰撞点组成 Island(岛屿),单独解算。
以下参数决定岛屿解算如何拆分到多线程执行:
- Island Solver Cost Threshold:岛屿计算成本超过该阈值时,拆分为多个 Job
- Island Solver Body Cost Scale:刚体的计算成本系数
- Island Solver Contact Cost Scale:接触点的计算成本系数
- Island Solver Joint Cost Scale:关节的计算成本系数
- Island Solver Bodies Per Job:解算岛屿时,每个 Job 处理的刚体数量
- Island Solver Contacts Per Job:解算岛屿时,每个 Job 处理的接触数量
建议
- Unity 已针对常见项目做过平衡,通常不需要调整。
- 物体数量多、CPU 多核时,可适当降低 per job 数值以增加 Job 并行。
- 物体不多但调度开销高时,可适当增大 per job 数值以减少 Job 数量。
59.2 知识点代码
Lesson59_性能优化_CPU_物理_2D物理系统基础设置.cs
public class Lesson59_性能优化_CPU_物理_2D物理系统基础设置
{
#region 知识点 Unity中的2D物理系统基础设置相关
//思维导图中讲解
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com