Unity 学习路径

Unity学习—UGUI优化Tips

2020-02-16  本文已影响0人  Warl_G

本文源地址:Unity学习—UGUI优化Tips

UI 标准

UI 每帧占用时间均值2-3ms

性能问题

问题定位

DrawCall

  1. batch
    避免同类型控件重叠
    同类型控件在不重叠时会自动合批传入一个drawcall
    UI重叠导致分层,分层导致同类型UIBatch分离,增加drawcall数量
    不规则图形,图形2D/3D旋转,图形放大,导致透明区域重叠
    z不一致也会导致分层

  2. 使用图集
    同一图集图像在合批时会自动优化到同一批,且加载时会同时加载

  3. 减少顶点修改以减少Rebatch
    如Image组件的Color属性改为修改Material属性 的tintcolor

  4. 调用方法
    Canvas.BuildBatch
    WaitingForJob
    PutGeometryJobFence
    BatchRender.Flush

  5. 单纯隐藏 UI, scale = 0, Alpha Group = 0

OverDraw

图片压缩

Android : ETC1>ETC2->RGBA16->RGBA32
iOS : PVRTC>ASTC->RGBA16->RGBA32

通道分离

针对Android平台Unity还提供了一种通道分离的方式:将图片压缩成ETC1,提取Alpha生成一张通道图。为了让混合起来的Alpha效果更好,Unity将通道图保存的格式设定为a8格式。比如一张1024X1024的贴图,ETC1压缩结果为0.5M,通道图提取后a8格式压缩结果为1M,加起来就是1.5M

通道图内存上可以减少一些,但是在Shader中需要进行2次采样

UI优化

  1. 界面中的Tab页尽量都做成单独的界面,切换后再动态加载
  2. 界面粒子特效最好不要预制在界面Prefab中,需要播放时再动态加载
  3. 界面打开从同步变成异步,从一帧变成多帧
    如打开界面先开一个底图,然后上面的元素再一个一个地冒出来,再配合一些UI动画,一帧一帧加载列表中的元素
  4. 有些类似头像或者icon的图标美术无法给出宽高被4整除的尺寸,可以给它设置一个唯一的SpriteTag打成一个图集,这样就可以压缩了
  5. 打开界面首帧Active和DeActive的次数过多,这个次数可以在Profiler中看到,其中Call的数量就是
  6. 很多UI在开发的时候都是从另一个相似界面复制一份出来,有些没用的对象只是隐藏并没有真正删除,所以要保证将没用的都删除掉
  7. 界面有可能有一些状态要进行切换,例如Tab页为了做起来方便,会把每个Tab页每个页面的内容都放进去,通过隐藏显示来控制各自的游戏对象。这种类似的情况都尽可能修改成运行时动态加载
  8. 做好分帧加载,可以将滑动列表的元素分帧一个个加载
  9. UI特效和界面上显示的模型,最好不要预制在界面中,一方面影响AssetBundle打包的依赖关系,还容易造成打开界面慢,可以通过代码动态分帧加载
  10. 尽可能少用LayoutGroup相关组件,或者自行来实现类似的功能
  11. 宽高任意一边超过256的图片最好不要打进图集
  12. 总之,对于首次打开慢的界面,我们一定要控制一帧内加载的UI元素和图集的数量
  13. 将每个界面的图片从Prefab中拆出来,将需要加载的图片名字序列化在Prefab中。这样界面中只保留了GameObject的树形结构,加载就不会慢了。界面打开后,再通过之前序列化好的名称,动态分帧地将贴图一个个加载上
  14. 操作界面之前以及操作界面之后确定UI是否在无意义重建,可以参考文章前面提到的方法得到到底哪些UI元素了引起UI的整个重建。
  15. 避免Active和DeActive,而采用修改显示layer的方式来控制隐藏显示。
  16. 不需要参与点击事件的Canvas取消激活Graphic Raycaster脚本。
  17. 仅用于显示的图片或者文本禁止勾选Raycast Target。
  18. 持续性的UI动态效果特效,最好脱离UI系统,采用特效的方式制作。
  19. 动态和静态的UI要区别对待,分别挂上canvas。
  20. 适当对UI界面做缓存,保证再次打开更快。
  21. 界面初始化代码部分添加上Profiler监测,统计代码效率。
  22. 将复杂的界面拆成多个界面,比如Tab页点击切换时再加载。
  23. 再次打开界面也需要控制一帧内加载UI的数量,做好分帧加载策略。

其他

上一篇 下一篇

猜你喜欢

热点阅读