UI优化

动静分离、拆分UI、预加载、字体拆分、滚屏优化、网格重构优化、展示关闭优化、对象池、贴图优化、图集拼接优化、UI业务逻辑中GC优化等。

一、动静分离

** 问题:**unity中UGUI系统都是使用网格模型来构建,UI元素只要“动”,就会发生网格的重构合并。正所谓牵一发而动全身,少的UI元素的动导致整个UI的重构,由此带来重绘导致了cpu的开销。

解决方案: UGUI系统亿Canvas作为自己的重绘节点,所以需要以canvas作为节点拆分动和静的UI元素。比如某个展示页面比较复杂,可以将那些静止不会发生变化的(动画、颜色、材质等)放到一个canvas下,把那些需要动的如常见的动画、特效等UI放到一个canvas下。有些常驻的动画,也可以单独做一个canvas作为这些效果的根结点。

二、拆分过重的UI

问题:随着项目的迭代,UI系统的复杂度不断上升。如果没有良好的划分和设计,会导致UI功能和结构越来越臃肿。UI实例化和初始化时,CPU消耗变大,后期维护迭代也变得越加困难。

解决方案:在UI设计的最初阶段就要把各个画布的主要职责划分出来,一些窗体和图标动效等也需要拆分出来作为预制体。对于一些复杂的界面加载和实例化,可以逐模块分散加载。

三、 UI预加载

问题:有些UI可能比较小、难以拆分,亦或者拆分后任然消耗很多CPU,它比较大常驻在界面。

解决方案:这些UI可以在游戏开始前加载UI资源但不实例化,只是将其加载到内存中。跟进一步将UI的实例化和初始化也提前到游戏开始前。实例化和初始化完成后,将其“隐藏”起来,待到需要的时候再将其展示出来。“隐藏”即可以将UI放在某一特定不被渲染或者未激活的层级,也可以将其放到摄像机视角之外藏起来(遮影步QAQ)。

Tips: Unity自带Preload功能,在编辑器平台设置里面。Unity会在进入应用的时候讲这些预制体进行预加载。

四、字体拆分

问题:字体一定程度上站了很大的空间(汉字),而且游戏打多需要的文字固定,没必要仅为少数的文字使用而加入整个字体库。

解决方案:数字字母等固定的字符可以单独打包,汉字常用字符3000足够游戏使用,真遇到特殊字符可以单独添加进去,在通过unity下的字体制作工具打包处理。

五、scroll view等列表优化

*问题:在背包或一些数据项比较多的应用中,scroll view常常会有大量的元素存在,他们在窗口中的不断滚动变化导致前面说的网格重构,消耗大量的CPU资源。

解决方案:类似scroll view这样的组建需要有自己优化过的自定义组件,当然也有很多这种优秀的开源方案。大都类似数据库查表一样进行将数据进行分页,只实例化加载稍微比可视化区域大点的数据项UI,当滚动达到一定范围后再销毁一部分不可见的元素,同时加载一部分后续可能显示的元素,也会借助后续提到对象池技术实现这一部分。

六、 网格重构优化

问题:UGUI系统网格合并机制是,只有将相同材质球的网格合并在一起,才能达到最佳效果。一个材质球对应一个图集,只有相同图集内的图片才需要合并在一起。当元素需要改变颜色时,是通过改变顶点颜色实现,然后将他们重新合批到网格中去。在UI动画里修改UI颜色时,UGUI都会对网格进行重构。

解决方案:此时我们需要自定义UI元素的材质球,通过自定义材质球改变相应的颜色变化,此时UGUI不再重构网格,因为把渲染工作交给了新的材质球,而非通过UGUI设置顶点颜色达到效果。(操作不当,自定义材质可能引发渲染排序等问题)

七、 UI的展示和隐藏

问题:打开和关闭界面都会消耗一定的CPU,打开需要实例化和初始化,关闭需要效果。

解决方案:利用碎片时间预加载。关闭时隐藏节点而不是效果,为了避免关闭和激活时网格重构,可以将UI移出屏幕,此时需要注意这些不可见的UI元素需不需要停止起内部的一些逻辑,待显示时再调用。为了避免移出屏幕导致的相机裁剪变化,可以单独设置一个层级为不可见的layout,需要显示时再将UI元素放在可见层级中去。

八、对象池的使用

问题:UI元素中比如scroll view中的选项类似于游戏物体中的子弹,需要大量的显示和效果,它们很零碎有很多,实例化和效果过程中会产生很多内存碎片和GC。

解决方案:采用对象池技术对这些对象池化,需要时从对象池申请,“销毁”时将其放到池中,重复利用内存。

tips:

  1. 每个需要使用对象池的对象都需要继承对象的基类对象,便于重载和区分,并区别初始化。
  2. 销毁时对对象池接口回收,不要重复或忘记回收,因此在设计的过程中就要统一接口。
  3. 场景结束时及时销毁对象池,避免内存驻留。
  4. 对象池应该是可伸缩的,在实例化对象超出对象池大小时自动扩充池子大小,在实例化对象不频繁和少量时可以缩减容量。

九、UI贴图优化

问题:倒入贴图资源时,贴图的某些属性或数据其实并不是必要的,但要占用很大的空间,不合理的贴图大小也会增大资源占用。

解决方案:导入贴图资源时注意事项:

  1. alpha通道是否需要
  2. 2次方贴图大小
  3. 读写权限是否需要
  4. minimal是否需要
  5. 合适的压缩方式。

    上述过程可以通过unity editor扩展asset importer pipeline的方式自动化管理,可以通过Texture Importer类控制指定导入路径的图片具体设置。

《Unity高级编程》读书笔记

Unity UI优化的更多相关文章

  1. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  2. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  3. 关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题

    有时候会发现 Unity UI 非常耗时,在 Profiler 中可以轻易的看到 UI 中 的 GraphicRaycaster.Raycast 单帧调用可以成百上千,甚至好几千,帧速率前不忍赌,一关 ...

  4. Unity全面优化

    前言 Unity的项目优化已经是老生常谈,很多人在项目完成之后,即便创意新颖,也会觉得差强人意,原因就在于没有做详细的项目优化.众所周知,Unity是一个综合性的3D开发引擎,其中包含图像渲染,逻辑处 ...

  5. Unity 性能优化(力荐)

    开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...

  6. Unity动画优化

    Unity动画优化 https://blog.csdn.net/TracyZly/article/details/79991593 Unity中Animator做UI动画的一些细节 https://b ...

  7. Unity项目优化——Web版

    Unity项目优化--Web版 大家好,这是小黑第一次写文章(哈哈哈哈哈,好激动),我好好的写,有不对的地方多多指出. 首先呢是版本介绍,不过好像版本对于优化没有影响: 不过还是要告诉大家我用的版本: ...

  8. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  9. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  10. Unity性能优化(1)-官方教程The Profiler window翻译

    本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...

随机推荐

  1. DataWorks 功能实践速览03期 — 生产开发环境隔离

    ​简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同 ...

  2. NopCommerce支持多种类型的数据库

    本文章的内容是根据本人阅读NopCommerce源码的理解,如有不对的地方请指正,谢谢. 阅读目录 1.类结构关系图 2.分析 3.NopCommerce应用 类结构关系图 分析 NopObjectC ...

  3. The instance of entity type 'Model' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.

    The instance of entity type 'Model' cannot be tracked because another instance with the same key val ...

  4. Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目

    Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 每博一文案 有句谚语说:"一怒之下踢石头,只有痛着脚趾头." 比一件糟糕的事情更可拍的,是你用糟糕的态度 ...

  5. 使用Elasticsearch在Rails中进行全文本搜索

    使用Elasticsearch在Rails中进行全文本搜索 参考: https://blog.csdn.net/cunjie3951/article/details/106921108

  6. Linux下vim的常用命令总结

    vim按d表示剪切 按dd剪切一行 vim命令:命令模式 /关键字 n继续向下查找 vim的多行注释: 1.按ctrl + v进入 visual block模式 2.按上下选中要注释的行 3.按大写字 ...

  7. ibus 输入法导致输入卡顿的解决方案

    系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...

  8. Windows server 2012 R2开机进入cmd,关闭后黑屏

    出现此问题,一般只有两种情况,操作系统装置前和操作系统装置后出现: 第一种: 装置操作系统的时候没有选择"Windows Server 2012 R2 Strandard( 带有GUI的服务 ...

  9. log4j的配置详解

    参考文章:https://www.jianshu.com/p/ccafda45bcea 引入log4j: 在项目中单独使用log4j进行日志的输出: maven依赖: <dependency&g ...

  10. Win10-常用cmd命令与快捷键

    以下全部是本人私认为平时经常用到的指令,持续更行中- 常用快捷键 win + R : 输入cmd回车,打开命令提示符界面 win + E : 打开文件资源管理器(俗称:文件夹) win + S : 搜 ...