Unity性能优化(3):优化UGUI

本文介绍了优化UnityUI性能的关键策略,包括使用UI批处理减少DrawCall、动静分离避免画布污染、禁用RaycastTarget提高交互性能、通过父画布隐藏UI和避免使用Animator。此外,还提供了优化ScrollRect和使用空UIText进行全屏交互的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

使用UI批处理

动静分离

为无交互的元素禁用Raycast Target

通过用父画布组件来隐藏UI元素

避免 Animator 组件

不要使用alpha隐藏UI元素

优化ScrollRect

使用空的 UIText 元素进行全屏交互


使用UI批处理

画布组件的主要任务是管理在层次窗口中绘制UI 元素的网格,并发出渲染这些元素所需的 Draw Call。 画布的另一个重要作用是将网格合并进行批处理(条件是这些网格的材质相同),以降低 Draw Call 数。将多个UI元素放置在相同的画布(Canvas)上,并启用UI批处理选项。这样可以减少渲染的批次数量,提高渲染性能。

动静分离

当画布或其子对象发生变动时,称为画布污染。画布污染后,就需要为画布上的所有 UI对象重新生成网格,这个重新生成网格的过程不是一个简单的任务,也是Unity 项目中性能问题的常见来源。如果把所有的UI都放到一个Canvas下,其中一个UI的变动将会导致Canvas的所有子UI都进行重新绘制。

所以应该努力尝试在生成画布时,基于元素更新的时间和频率对元素分组。

静态UI元素是指那些在场景中位置和状态较为稳定的UI元素,如标题、背景、固定的按钮等。这些元素通常在运行时不需要频繁修改或更新。

动态UI元素是指那些需要根据游戏状态或用户交互而经常变化的UI元素,如计分牌、倒计时、HP条等。这些元素的状态可能需要频繁更新,并且需要响应用户的输入或游戏事件等。

为无交互的元素禁用Raycast Target

UI元素具有Ruycast Targer 选项,允许该元素通过单击、触发和其他用户行为进行交互。当以上任何一个动作发生时,GraphicsRaycaster 组件将执行像素的边界框检查,以确定与之交互的是哪个元素,这是一个简单的选代for 疆坏。对非交互元素禁用此选项,就减少了 GiraphicsRaycaster 需要选代的元素数量,提高了性能。

通过用父画布组件来隐藏UI元素

UI 使用单独的布局系统来处理某些元素类型的重新生成工作,其操作方式类似于画布污染。UImage、UTText 和 LayouiGroup 都是属于这个系统的组件示例。很多操作可能导致布局系统被污染,其中最明显的是启用和禁用这些元素。

解决办法是,如果想禁用 UI 的一部分,只要禁用其子节点的画布组件,就可以避免布局系统的这种开销较大的重新生成调用。为此,可以将画布组件的 enabled 属性设置为false.


避免 Animator 组件

Unity 的 Animator 组件从未打算用于最新版本的 UI 系统,它们之间的交互是不切实际的。每一帧,Animator 都会改变 UI 元素的属性,导致布局被污染,重新生成许多内部 UI 信息。应该完全避免使用 Animator, 而使用自己的动画内插方法或使用可实现此类操作的程序。

不要使用alpha隐藏UI元素

color 属性中,alpha 值为0的UI 元素仍会发出 Draw Call。 应该更改UI元素的 isActive 属性,以便在必要时隐藏它。另一种方法是通过 CanvasGroup 组件使用画布组,该组件可用于控制其下所有子元素的 alpha 透明度。画布组的alpha 值设置为0,将清除其子对象,因此不会发出任何 Draw Call。

优化ScrollRect

ScrollRect的性能随着大小的改变会变得非常差,因为画布需要定期重新生成它们。但是,可以用以下方式改善 SerollRect 组件的性能。

在ScrolRect 中禁用 Pixel Perfecto Pixel Perfeat 是面布组件上的一个设置,它强制其子UI 元素与屏幕上的像素对齐。这通常是美术和设计的一个要求,因为UI元素将比禁用它时显示得更加清晰。虽然这种对齐操作的开销是相当大的,但它是强制性的,可以保证大部分的 UI 元素显示得更清晰。但是,对于动画和快速移动的物体,由于涉及运动,因此 Pixel Perfect 没有太大意义。禁用 ScrollRect 元素的 Pixel Perfect 属性是一种节省大量成本的好方法。

手动停用 ScrollRect 活动。即使移动速度是每帧只移动像素的一小部分,画布也需要重新生成整个 ScrolRect 元素。一旦使用 ScrollRect. velocity和ScrollRect.StopMovemento方法检测到帧的移动速度低于某个國值,就可以手动冻结它的运动。这有助于大大降低重新生成的频率。


使用空的 UIText 元素进行全屏交互

大多数UI的常用实现是激活一个很大、透明的可交互元素来覆盖整个实体屏幕,并强制玩家必须处理弹出窗口才能进入下一步,但仍然允许玩家看到元素背后发生的事情(作为一种不让玩家完全脱离游戏体验的方法)。这通常由 UI Image元素完成,但可惜的是可能会中断批处理操作,透明度在移动设备上可能会是一个问题。

解决这个问题的简单方法是使用一个没有定义字体或文本的 UIText 元素。这将创建一个不需要生成任何可渲染信息的元素,只处理边界框的交互检查。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值