UGUI的性能从三方面来优化
一、从CPU方面优化
1、重建界面:
- 尽量减少Rebuild的频率,将动态和静态的元素分离,放到不同的Canvas里面
- 使用尽可能少的UI元素。这里指的是删除不必要的节点和隐藏不用的节点。这样能减少深度排序和rebuild Layout的执行时间
2、触摸事件
对应不需要接受输入的元素。一定要关闭Raycast Target选项
3.UI的隐藏和显示
UI切换的时候,有两个地方非常耗时,一个是SetActive,另外一个则是SetParent。
SetParent暂时没有好的处理方法
SetActive可以在切换UI的时候。不把UI 设置SetActive(false),而是设置UI的Layer。
给需要隐藏的设置一个canvas,单独设置相机,对update等脚本做控制
4.减少DrawCall
https://www.cnblogs.com/murongxiaopifu/p/4284988.html dc更多是优化cpu的效率,减少cpu调用图形接口的开销
- 合批
图集
相同材质,相同纹理对象相邻
注意控制层级号
- 避免或减少Mask的使用,1个Mask至少增加两个DC
二、从GUP方面优化
原因:
- 造成GPU的性能瓶颈一般在复杂的shader和overdraw造成的像素填充过多
- overdraw主要是因为大量的UI重叠引起的
降低overdraw可以做如下优化:
- 禁用开不见的UI。在被别的UI全部挡住时。可以考虑将系统禁用
- 尽量减少alpha = 0的资源的使用,因为这种资源也会参与绘制,占用一定的GPU。
- 制作图集的时候,尽量使小图排布紧凑,尽量图集中大面积留白,理由同上。
- 如果sprite是中心镂空且切图为九宫格时,可以去除fill center,以减少over draw
- 不要使用空的Image。游戏中许多时候会使用一个透明的Image组件来监听点击事件或者屏蔽Image后面的按钮事件,空的Image可以解决这个问题,用起来也很方便,但是空的Image照旧会参与绘制,从而产生overdraw。解决办法是扩展Graphic组件来替换Image组件,RayCast使用Graphic作为基本元素来检测touch。
- https://blog.csdn.net/zhenmu/article/details/88821562 实现新的outline
三、内存
控制纹理的图片压缩格式
图片尺寸大小为2次幂或者能被4整除
控制图集的大小,减小内存碎片
九宫格
复用的循环列表
关闭mipmap
关闭read&write
子体资源剔除(字体资源(Font)以及文本资源(Text Asset))
主要是以下几个方面会导致内存有问题:
- 纹理
- 网格
- 材质
- 动作
- 音频
- 游戏对象的数量
2、参考
https://blog.csdn.net/shengtianzhu/article/details/90180001
https://blog.csdn.net/gaojinjingg/article/details/103565840