77.性能优化-GPU-UI系统优化-禁用RaycastTarget
77.1 知识点
Raycast Target 是什么
UGUI 中每个能显示的图形内容(Image、Text、RawImage、TMP_Text 等)都有一个布尔选项 Raycast Target(射线检测目标)。它决定了该图形是否作为射线检测的目标,可以简单地把 Raycast Target 类比成“能不能被点中”的开关:勾选时该对象可以被检测到并参与选中逻辑,不勾选则不会被检测。
工作流程大致是:
- **
GraphicRaycaster**(射线检测组件)在处理输入事件(点击、拖拽、触摸)时,会从EventSystem发出一条射线。 - 这条射线会检测当前 Canvas 下所有
Raycast Target = true的 UI 元素。 - 每个元素会计算射线是否落在它的矩形或多边形范围内。
- 命中后,事件系统再决定触发哪个控件(
Button、Toggle、Scrollbar等)的交互逻辑。
为什么要禁用 Raycast Target
勾选 Raycast Target 可能带来的性能问题:
- 检测内容太多:默认所有
Image、Text等图形控件的 Raycast Target 都是开启的,即使只是装饰图也会被遍历,遍历就有开销。 - 每帧检测:射线检测在每次输入(移动/点击/拖拽)时都会执行,可能每帧都要做,检测本身就有开销。
- 计算成本:每个目标要进行矩形碰撞或更复杂的遮罩判断(
Mask、RectMask2D),子元素越多,计算成本越高。
因此,不需要交互的 UI 对象开启 Raycast Target 会增加不必要的开销。通过禁用它可以有效提高性能、降低开销,主要好处是:
- 事件系统在遍历时直接跳过该元素,减少遍历开销。
- 避免无意义的射线计算,减少计算开销。
使用建议:
- 建议关闭的:背景图、装饰图标、分割线、阴影、UI 框架图、纯装饰性/说明性文字等。
- 需要保留的:
Button、Toggle、Slider、ScrollRect等可交互区域或控件。
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