77.禁用RaycastTarget

77.性能优化-GPU-UI系统优化-禁用RaycastTarget


77.1 知识点

Raycast Target 是什么

UGUI 中每个能显示的图形内容(ImageTextRawImageTMP_Text 等)都有一个布尔选项 Raycast Target(射线检测目标)。它决定了该图形是否作为射线检测的目标,可以简单地把 Raycast Target 类比成“能不能被点中”的开关:勾选时该对象可以被检测到并参与选中逻辑,不勾选则不会被检测。

工作流程大致是:

  1. **GraphicRaycaster**(射线检测组件)在处理输入事件(点击、拖拽、触摸)时,会从 EventSystem 发出一条射线。
  2. 这条射线会检测当前 Canvas 下所有 Raycast Target = true 的 UI 元素。
  3. 每个元素会计算射线是否落在它的矩形或多边形范围内。
  4. 命中后,事件系统再决定触发哪个控件(ButtonToggleScrollbar 等)的交互逻辑。

为什么要禁用 Raycast Target

勾选 Raycast Target 可能带来的性能问题:

  1. 检测内容太多:默认所有 ImageText 等图形控件的 Raycast Target 都是开启的,即使只是装饰图也会被遍历,遍历就有开销。
  2. 每帧检测:射线检测在每次输入(移动/点击/拖拽)时都会执行,可能每帧都要做,检测本身就有开销。
  3. 计算成本:每个目标要进行矩形碰撞或更复杂的遮罩判断(MaskRectMask2D),子元素越多,计算成本越高。

因此,不需要交互的 UI 对象开启 Raycast Target 会增加不必要的开销。通过禁用它可以有效提高性能、降低开销,主要好处是:

  1. 事件系统在遍历时直接跳过该元素,减少遍历开销。
  2. 避免无意义的射线计算,减少计算开销。

使用建议:

  • 建议关闭的:背景图、装饰图标、分割线、阴影、UI 框架图、纯装饰性/说明性文字等。
  • 需要保留的ButtonToggleSliderScrollRect 等可交互区域或控件。

77.2 知识点代码

Lesson77_性能优化_GPU_UI系统优化_禁用RaycastTarget.cs

public class Lesson77_性能优化_GPU_UI系统优化_禁用RaycastTarget
{
    #region 知识点一 RaycastTarget是什么

    //UGUI 中每个 能显示的图形内容(Image、Text、RawImage、TMP_Text等等)
    //都有一个布尔选项 Raycast Target(射线检测目标)
    //它决定了该 图形 是否作为 射线检测的目标
    //可以简单的把 RaycastTarget 类比成 能不能被点中 的开关
    //勾选它,该对象可以被检测到选中;不勾选,该对象不会被检测

    //它的工作流程是:
    //1.GraphicRaycaster(射线检测组件)
    //  在处理输入事件(点击、拖拽、触摸)时,会从 EventSystem 发出一条射线
    //2.这条射线会检测 当前 Canvas 下所有 RaycastTarget = true 的 UI 元素
    //3.每个元素会计算射线是否落在它的矩形或多边形范围内
    //4.命中后,事件系统再决定触发哪个控件的(Button、Toggle、Scrollbar) 交互逻辑

    #endregion

    #region 知识点二 为什么要禁用RaycastTarget

    //勾选RaycastTarget可能带来的性能问题
    //1.检测内容太多
    //  默认所有 Image、Text 等图形控件的 RaycastTarget(射线检测目标) 都是开启的
    //  即使它只是一个装饰图,也要被遍历,遍历就会存在开销
    //2.每帧检测
    //  射线检测每次输入(移动/点击/拖拽)都要做,可能需要每帧都执行
    //  检测就会带来开销
    //3.计算成本
    //  每个目标要进行矩形碰撞或更复杂的遮罩判断(Mask、RectMask2D),子元素越多,计算成本越高

    //因此,如果一个不需要进行交互的UI对象,开启RaycastTarget就会增加开销
    //通过禁用它可以有效的提高性能,降低开销
    //主要带来的好处是:
    //1.事件系统在遍历时直接跳过它,减少遍历开销
    //2.避免了无意义的射线计算,减少计算开销

    //使用建议:
    //1.一定要禁用的
    //  背景图、装饰图标、分割线、阴影、UI 框架图、纯装饰性、说明性文字
    //2.必须保留的
    //  Button、Toggle、Slider、ScrollRect 可交互区域或控件

    #endregion
}


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

×

喜欢就点赞,疼爱就打赏