57.性能优化-CPU-物理-碰撞层矩阵
57.1 知识点
知识回顾:物理检测中的广义阶段和狭义阶段
物理引擎中的碰撞检测一般分两步:
Broadphase(广义阶段 / 粗检测阶段 / 宽阶段检测)
- 目标:快速找出可能会相撞的一对对象
- 方法:用简单的边界盒(AABB:Axis-Aligned Bounding Box,轴对齐包围盒)进行检测
- 特点:速度快但不精确,只负责筛选候选对,不计算是否真的碰撞
Narrowphase(狭义阶段 / 精检测阶段 / 窄阶段检测)
- 目标:对 Broadphase 找到的候选对象进行精确检测
- 方法:用实际碰撞体形状(球体、胶囊体、多边形、网格等)计算真正的接触点
- 特点:精确但耗时大
Broadphase 相当于安检口的初筛,是碰撞检测的第一步。
优化物理引擎消耗的主要思路
物理引擎的 CPU 消耗主要来自碰撞检测和物理解算的计算量。
Unity 物理模块会对所有可能发生碰撞的对象进行检测,这是开销最大的部分之一。
优化思路的核心是减少物理相关的无效计算。例如:
- 上节课学习的增加物理更新时间步长,就是一种减少物理计算的方式,但要注意不能影响物理表现。
- 本节课的碰撞层矩阵设置,是 Unity 提供的有效方案,用于避免无效计算。
Layer Collision Matrix(碰撞层矩阵)设置
Layer Collision Matrix 可在 Project Settings -> Physics 相关页签中找到。


作用说明
在 Unity 物理系统中,每个碰撞器都属于某个 Layer。
Layer Collision Matrix 是一张 Layer 与 Layer 之间是否参与碰撞检测的开关表:
- 勾选:两个层中的碰撞器会进行碰撞检测
- 取消勾选:两个层中的碰撞器完全不会进入 Broadphase,引擎直接忽略这对 Layer 组合,从而节约 CPU
Layer Collision Matrix 相当于全局碰撞过滤器。
举例说明
假设游戏中有 Player、Monster、Bullet、UI 等层,默认设置下:
- Bullet 会与 Player、Enemy、UI 层都进行碰撞检测
- Player 也会与 UI 层检测
这会产生大量无意义检测。通过设置 Layer Collision Matrix,可以大幅减少无意义计算,优化 CPU 性能。
示例:代码中动态忽略层碰撞
// 在代码中临时忽略某两个层之间的碰撞
Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Player"), LayerMask.NameToLayer("UI"), true);
57.3 知识点代码
Lesson57_性能优化_CPU_物理_碰撞层矩阵.cs
public class Lesson57_性能优化_CPU_物理_碰撞层矩阵
{
#region 知识回顾 物理检测中的广义阶段和狭义阶段
//在物理引擎中,碰撞检测一般分两步:
//1.Broadphase(广义阶段|粗检测阶段|宽阶段检测)
// 目标:快速找出可能会相撞的一对对象
// 方法:用简单的边界盒(AABB:Axis-Aligned Bounding Box,轴对齐包围盒)进行检测
// 特点:非常快,但不精确。它不会算真的撞没撞,只负责筛选出候选对
//2.Narrowphase(狭义阶段|精检测阶段|窄阶段检测)
// 目标:对 Broadphase 找到的候选对象,进行更精确的检测
// 方法:用实际碰撞体形状(球体、胶囊体、多边形、网格等)计算真正的接触点
// 特点:精确但耗时大
//因此在进行碰撞检测时,Broadphase 就像安检口的初筛,它是第一步会做的事情
#endregion
#region 知识点一 优化物理引擎消耗的主要思路
//物理引擎的CPU消耗,本质上就是碰撞检测和物理解算的计算量
//Unity的物理模块会对所有可能发生碰撞的对象进行检测
//而这一步就是开销最大的部分之一
//因此优化物理引擎消耗的主要思路
//就是从本质上减少物理相关的无效计算
//比如我们上节课学习的 增加物理更新时间步长 就是减少物理计算的一种方案
//但是在采用这种方案时,一定要注意不能影响我们的物理表现
//而我们这节课将要学习的碰撞层矩阵设置
//就是Unity提供给我们的避免无效计算的有效解决方案
#endregion
#region 知识点二 Layer Collision Matrix(碰撞层矩阵)设置
//Layer Collision Matrix(碰撞层矩阵)设置
//可以在Unity的 Project Settings 中的 Physics 相关页签中找到
//在Unity的物理系统中
//每个碰撞器都属于某一个Layer(层级)
//Layer Collision Matrix(层碰撞矩阵) 就是一张 Layer 与 Layer 之间是否参与碰撞检测的开关表
//1.勾选,则两个层中的碰撞器会进行碰撞检测
//2.取消勾选,则两个层中的碰撞器完全不会进入Broadphase(广义阶段)
// 引擎会直接忽略这对Layer组合,可以节约CPU消耗
//总的来说
//Layer Collision Matrix(碰撞层矩阵)
//就是一个全局碰撞过滤器
//举例说明
//假设游戏中有
//Player
//Monster
//Bullet
//UI
//默认设置
//Bullet会跟Player、Enemy、UI层都进行碰撞检测
//Player也会跟UI层检测
//这样的结果就是
//产生了大量的无意义的检测
//我们可以通过设置Layer Collision Matrix(层碰撞矩阵)
//大幅减少无意义计算,从而优化CPU性能
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com