Unity UGUI 优化
本文主要记录Unity UGUI 常用的优化项
Canvas.SendWillRenderCanvases
此函数的耗时代表的是 UI 元素自身变化带来的更新耗时,可以理解为 UI 更新的耗时。
触发条件
- 替换图片
- 文本变化
- 颜色变化
UI 元素位移、旋转、缩放操作并不会引起此函数
优化方案
- 降低频繁更新的 UI 元素的频率
- 尽量让复杂的 UI 不要发生变动
- 控制动态元素 Canvas 网格数量
Canvas.BuildBatch & Rendering.EmitWorldScreenspaceCameraGeometry
Canvas.BuildBatch是在主线程发起UI网格合并,具体的合并过程是在子线程中处理的,当子线程压力过大,或者合并的UI网格过于复杂的时候,会在主线程产生等待,等待的耗时会被统计到EmitWorldScreenspaceCameraGeometry中。
触发条件
Canvas.BuildBatch为UI元素合并的Mesh需要改变时所产生的调用。
- Canvas.SendWillRenderCanvases()的调用都会引起Canvas.BuildBatch的调用。
- Canvas中的UI元素发生移动也会引起Canvas.BuildBatch的调用。
优化方案
这两个函数高耗时,说明重建的 Canvas 非常复杂。
- Canvas 动静分离
- 降低网格复杂度
CanvasRenderer.SyncTransform
触发条件
- Transform 信息变化
例如:画在屏幕空间的 Hub,会跟随 Player 的视角 or 移动产生位移;此时一次触发 Transform 信息变化的 UI 元素量较大,如果有文本这类网格数多的对象时对性能影响还会进一步增大 - 调用 Instantiate 实例化对象
实例化 UI 对象时,会使得自己本身,同 Canvas 下的 UI 元素,父 Canvas 下的元素,都触发一次 SyncTransform - 调用 Destroy 销毁对象
再销毁对象时,只会影响自己同 Canvas 下的 UI 元素触发一次 SyncTransform - 调用 SetActivity (true) 激活 UI 元素
SetActivity(true) 激活 UI 元素,会使得自己本身,同 Canvas 下的 UI 元素,父 Canvas 下的元素,都触发一次 SyncTransform
SetActivity (false) 不会触发
优化方案
- 动静分离
- 将需要频繁进行上述操作的 UI 和其他的 UI 元素分离到不同的同级 Canvas 下
- 设计合理的 Canvas 的嵌套结构
- 中间节点的 Canvas 不要有复杂的 UI 元素,实例化和激活都会影响到父 Canvas
EventSystem.Update
- 触发调用耗时
函数为触摸释放时候触发,该函数本身有较高的 CPU 开销时,通常是因为调用了其他耗时函数引起的。定位耗时函数优化即可。可以使用 Profiler. BeginSample/EndSample, Profiler 开启 Deep Profiler 定位 - 轮询耗时
尽量关闭 UI 元素的 Raycast
UI DrawCall
- 同一 Canvas 下的 UI 元素才能合批
- 使用图集,让不同 UI 元素的的材质图集一致
- 尽量避免 UI 层级穿插导致 UI 合批失败(可以使用 Unity -> Analysis -> Frame Debugger 查看合批情况)
Unity UGUI 优化
https://lshgame.com/2026/01/09/Unity_UI_Optimization_Items/