type
status
date
slug
summary
tags
category
icon
password
UI 优化是每个 Unity 项目都逃不掉的必修课。不合理的 UI 设计与制作规范会带来严重的性能问题。下面将从几个方面列举一些常用的 UI 制作与优化手段。

图集(SpriteAtlas)

图集的种类

  • 公共图集 所有系统公用的,如:物品/装备/技能等各种图标,角色头像/头像框,确认按钮/取消按钮/关闭按钮等
  • 功能图集 各个系统独有的,如:列表的底框,功能的横幅,界面上特有的装饰性花纹等

规则与建议

  • 每个系统专用的散图尽量打到一张图集里(这是最优的情况),美术设计时也需要注意单个界面不要出现过多过大的散图,导致超出一张图集范围
  • 公共图集跟功能图集尽量不要出现穿插,一穿插必然会打断合批
  • 公共的背景图可独立一张图集,否则多个大型背景图合并可能会超过最大尺寸导致生成了多页
  • 美术字/TMP用到的字体酌情考虑跟功能图合并到一起

材质

  • 所有UI节点都使用统一材质(一般留空即可,即使用默认的UI-Default材质)
  • 所有UI粒子尽量使用统一材质(UI/Additive)

字体

  • 程序字(非TMP)跟图片穿插会打断合批
  • 界面打开前建议对“固定的”或者“可预期的”程序字进行预生成(使用Font.RequestCharactersInTexture接口),否则会有瞬间的TextGenerator 高消耗(尤其滑动列表内)
  • 美术字建议跟着功能走,跟各个功能散图打成一张图集,美术字重复出现在各功能图中也没关系

动画与特效

  • 动静分离,动画/特效分离到上层独立Canvas
  • 非必要不要出现穿插动画,否则会导致整个界面每帧都在Rebuild
  • 注意特效,一定要严控粒子系统使用的数量,以及每个系统同时发射粒子数量粒子生命时长(重灾区)
  • 超大贴图(100x100以上)粒子系统,会带来非常高的Overdraw
  • 一次性动画播完后建议把Animation组件直接Disable掉

Canvas

  • 按照功能层级进行画布划分,如:最底下的全屏窗口为一层,中间的非全屏弹出框为一层,上面的消息通知框为一层,顶部的全屏加载窗口为一层,等等
  • 界面内动态元素独立一个SubCanvas

Overdraw

  • UI设计时重叠层数不要过高,5层以内基本能满足需求,1层最佳(一般都做不到);当然指的是局部重叠,不是全屏重叠5层,全屏重叠3层都算过多了
  • 全屏覆盖的多个窗口,底下的直接SetActive(false) ,始终保持只有最上层的一个处于激活状态
  • 全屏界面覆盖时,如果底下还有3D场景的,把所有场景相机也关闭掉,同时targetFrameRate建议也调低

Mask

  • Mask会破坏合批,非必要的Mask能不用就不用
  • 不得不使用的话,优先使用RectMask2D替代Mask

Layout

  • 除了滑动列表(水平/垂直滑动),其他情况下尽量不要使用LayoutGroup
  • 如果需要简单的水平或垂直布局,建议使用Anchors的方式来实现
  • LayoutGroup不要嵌套,嵌套时更新性能很低
  • 使用无限循环列表避免一次性生成大型列表

RaycastTarget

  • 禁用不需要的RaycastTarget
  • 建议项目中自己参考uGUI源码重写MenuOptions以及DefaultControls,完全控制UI的生成菜单,把RaycastTarget 默认关掉,需要用到的地方再自行开启
多种导入格式图片内存占用对比C#基础:协变与逆变
Loading...