Unity学习笔记之——ugui的性能优化

news/2025/2/28 18:39:13/

在Unity中UI优化的核心问题就是重绘和批处理之间的平衡

一、Canvas优化要点

1.优化原因:

(1)Unity为了性能优化,会合并Canvas下的所有元素;

(2)如果把所有面板放到一个Canvas下,会造成重绘Redraw(反复绘制);

        下面列出了Unity中导致Canvas变脏的地方:

        · 设置顶点脏——SetVerticesDirty,如RectTransform、Image中各种参数修改等;

        · 设置材质脏——SetMaterialDirty,如Material、Texture相关修改等;

        · 设置布局脏——SetLayoutDirty,如Layout系列组件进行的修改等;

        · 设置上面三个都脏——SetAllDirty。

        所以说,对于UI,基本上只要动了就会触发Canvas重绘。

(3)在UGUI中,当Canvas中的元素发生任何变化(如主动切换、移动或调整大小等),都会运行一个过程(重建)来重建整个Canvas UI网格。重建过程的成本很高,如果执行太多次,或Canvas中的ui数量很大,性能就会受影响。

2.优化方法:

(1)一个Canvas下的所有UI元素都是合在一个Mesh中的,过大的Mesh在更新时开销很大,一般建议每个较为复杂的UI界面,都创建一个Canvas(可以是子Canvas),在UI界面很复杂时,甚至要划分更多的子Canvas,而Canvas又不能细分的太多,因为会导致DrawCall的上升;如果子画布中包含的元素发生变化(除了子画布中的UI被SetActive切换活动状态),则只会运行子画布的重建,而不会运行父画布。

(2)动静分离,理论基础是子Canvas不会导致父Canvas重绘。

        由于Canvas负责将几何图形合并成批,并且生成对应的渲染命令发送给Unity图形管线,所以动静分离虽然减少了Canvas重绘,但是增加了批次;

(3)把一个面板的UI资源放到一个图集里;

二、Mask遮罩

Mask可以在任何形状中被掏空,而RectMask2d只能被掏空为矩形。

用于剔除每帧的CPU负载与其屏蔽目标的增加成正比,所以要尽可能避免使用遮罩,即使使用了,在不需要时将enabled设置为false。

三、TextMeshPro

在TextMeshPro中设置文本的常用方法是将文本分配给text属性,但是还有另一个方法SetText。
例如,SetText有许多重载,它们接受字符串和float类型的值作为参数。

//1.这种方法减少了生成字符串的成本。
btnText.SetText("{0}", number);//2.这种方法会执行float类型的ToString(),因此每次执行此过程都会产生字符串生成成本
btnText.text = number.ToString();

TextMeshPro的这个特性在与ZString 结合使用时也非常强大。
ZString是一个库,它减少了字符串生成过程中的内存分配。ZString为TMP_Text类型提供了许多扩展方法,通过使用这些方法,可以实现灵活的文本显示,同时减少字符串生成的成本。

四、UI显示开关

uGUI组件的特点是使用SetActive切换对象的高成本。这是由于OnEnable为各种重建设置Dirty标志并执行与掩码相关的初始化。因此,考虑使用SetActive方法的替代方法来切换UI的显示是很重要的。
第一种方法是将Canvas的enabled更改为false。这将阻止画布下的所有对象被渲染。因此,这种方法的缺点是,它只能在您想要隐藏Canvas下的所有对象时使用。

另一种方法是使用CanvasGroup。它有个函数可以调整它下面所有物体的透明度。如果你使用这个函数并将透明度设置为0,你可以隐藏其CanvasGroup

不过要注意这样处理虽然避免了由SetActive引起的负载,但gameobject会保持在活动状态,可能也会产生负载。

五、补充

非UI对象只要移出了视口,就不会进行批处理了。而UI对象需要将Canvas设置成WorldSpace模式或者Camera模式,而不是Overlay模式,在移出视口后才不会进行批处理。否则一旦使用Overlay模式,即使移出了视口也仍然会进行批处理。

一旦某个Canvas上存在一个UI在视口内(需要被渲染),则整个Canvas上的所有UI都需要被批处理。所以说要么把Canvas移出去很远(保证Canvas上的所有内容不渲染),要么不移出去(渲染Canvas上的所有内容)。


http://www.ppmy.cn/news/1575569.html

相关文章

蓝桥杯 5.字符串

蓝桥杯 5.字符串 文章目录 蓝桥杯 5.字符串KMP&字符串哈希Manacher编程138-148字典树基础01Trie编程149-155 KMP&字符串哈希 KMP算法 字符串匹配算法, 用于匹配**模式串P(短)和文本串S(长)**中出现的所有位置, 例如, S “ababac”, P “aba”, 那么出现的所有位置就…

Imagination通过最新的D系列GPU IP将效率提升至新高度

Imagination DXTP GPU IP在加速移动设备和其他电力受限设备上的图形和计算工作负载时,能够延长电池续航时间。 英国伦敦 – 2025年2月25日 – 今日,Imagination Technologies(“Imagination”)宣布推出其最新的GPU IP——Imagina…

NTS库学习,找bug中......

基础知识 Coordinate: 表示一个二维坐标点,包括 X 和 Y 坐标值。 CoordinateSequence: 由一系列 Coordinate 对象组成的序列,可以表示线、多边形等几何对象的顶点。 CoordinateFilter: 用于对几何对象的坐标进行过滤或修改的接口。 Geometry: 表示一个几…

QT 中的元对象系统(二):元对象实现原理QMetaObject

目录 1.元对象系统的构成 2.QObject和QMetaObject的关系 3.Qt 元对象模型QMetaObject 3.1.基本信息 3.2.类信息classinfo 3.3.类构造函数constructor 3.4.枚举信息 enumerator 3.5.类方法method 3.6.类属性peoproty 4.MOS(Meta Object System)示例 5.总结 1.元对象系…

端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port

文章目录 需求:A机器是内网机器,B机器是公网服务器,想要从公网,访问A机器的端口方式:端口映射,内网穿透,使用ssh打洞端口:遇到问题:命令执行成功,但是端口转发…

SSL 证书是 SSL 协议实现安全通信的必要组成部分

SSL证书和SSL/TLS协议有着密切的关系,但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格: 属性SSL/TLS 协议SSL证书英文全称SSL(Secure Sockets Layer),TLS(Transport Layer Security&am…

Cherry Studio + 火山引擎 构建个人AI智能知识库

🍉在信息化时代,个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时,效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…

C#上位机--二级运算符

序言 在 C# 编程领域,尤其是针对上位机开发时,二元运算符是构建复杂逻辑和高效代码的基础工具之一。它们通过对两个操作数进行运算,为开发者提供了丰富的数据处理手段。接下来,我们将深入探讨 C# 上位机中的二元运算符&#xff0…