57.碰撞层矩阵设置

57.性能优化-CPU-物理-碰撞层矩阵


57.1 知识点

知识回顾:物理检测中的广义阶段和狭义阶段

物理引擎中的碰撞检测一般分两步:

  1. Broadphase(广义阶段 / 粗检测阶段 / 宽阶段检测)

    • 目标:快速找出可能会相撞的一对对象
    • 方法:用简单的边界盒(AABB:Axis-Aligned Bounding Box,轴对齐包围盒)进行检测
    • 特点:速度快但不精确,只负责筛选候选对,不计算是否真的碰撞
  2. Narrowphase(狭义阶段 / 精检测阶段 / 窄阶段检测)

    • 目标:对 Broadphase 找到的候选对象进行精确检测
    • 方法:用实际碰撞体形状(球体、胶囊体、多边形、网格等)计算真正的接触点
    • 特点:精确但耗时大

Broadphase 相当于安检口的初筛,是碰撞检测的第一步。

优化物理引擎消耗的主要思路

物理引擎的 CPU 消耗主要来自碰撞检测和物理解算的计算量。
Unity 物理模块会对所有可能发生碰撞的对象进行检测,这是开销最大的部分之一。

优化思路的核心是减少物理相关的无效计算。例如:

  • 上节课学习的增加物理更新时间步长,就是一种减少物理计算的方式,但要注意不能影响物理表现。
  • 本节课的碰撞层矩阵设置,是 Unity 提供的有效方案,用于避免无效计算。

Layer Collision Matrix(碰撞层矩阵)设置

Layer Collision Matrix 可在 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 性能。

示例:代码中动态忽略层碰撞

// 在代码中临时忽略某两个层之间的碰撞
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

×

喜欢就点赞,疼爱就打赏