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
默认关掉,需要用到的地方再自行开启
- 作者:VyronLee
- 链接:https://vyronlee.com/article/b36aa0d7-4948-4c69-b3eb-bf7e3cc302db
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。