Unity UGUI 优化

本文主要记录Unity UGUI 常用的优化项

Canvas.SendWillRenderCanvases

此函数的耗时代表的是 UI 元素自身变化带来的更新耗时,可以理解为 UI 更新的耗时。

触发条件

  1. 替换图片
  2. 文本变化
  3. 颜色变化
    UI 元素位移、旋转、缩放操作并不会引起此函数

优化方案

  1. 降低频繁更新的 UI 元素的频率
  2. 尽量让复杂的 UI 不要发生变动
  3. 控制动态元素 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

触发条件

  1. Transform 信息变化
    例如:画在屏幕空间的 Hub,会跟随 Player 的视角 or 移动产生位移;此时一次触发 Transform 信息变化的 UI 元素量较大,如果有文本这类网格数多的对象时对性能影响还会进一步增大
  2. 调用 Instantiate 实例化对象
    实例化 UI 对象时,会使得自己本身,同 Canvas 下的 UI 元素,父 Canvas 下的元素,都触发一次 SyncTransform
  3. 调用 Destroy 销毁对象
    再销毁对象时,只会影响自己同 Canvas 下的 UI 元素触发一次 SyncTransform
  4. 调用 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/
作者
SuHang
发布于
2026年1月9日
许可协议