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. 一图速览 | DTCC 2021大会,阿里云数据库技术大咖都聊了些什么?

    ​简介: 3天9场干货分享,快来收藏吧! 10月18日~10月20日, 由国内知名IT技术社区主办的数据库技术交流盛会--DTCC 2021 (第十一届中国数据库技术大会)在京圆满落幕.大会以&quo ...

  2. WPF开源轻便、快速的桌面启动器

    前言 今天大姚给大家分享一款WPF开源.简单.轻便.快速的桌面启动器(支持多主题.多语言:简体中文.繁体中文.英文等):CurvaLauncher. WPF介绍 WPF 是一个强大的桌面应用程序框架, ...

  3. [Contract] 测试 Solidity 合约代码的两种方式 与 优缺点

    第一种,使用 Truffle 这类继承了测试工具的框架,只要编写 js 脚本就可以测试 web3 与合约的逻辑. 优点是完全可控,粒度够细,便于集成测试:缺点是需要花费一些时间编写测试脚本,不过值得. ...

  4. vue-单独引入js文件,构造全局方法-取某个范围的随机数(百分比)案例

    1.项目下建文件夹commonFunction->random.js 这个js文件内复制代码: export default{     randomPercentage:function(a,b ...

  5. windows系统桌面壁纸切换的三种csharp办法,兼容win10及旧版,还有一个现成桌面小程序

    我自己用这些代码做的小app如下: 最新版本已经改成了服务的方式,也可以选择性添加系统的右键菜单,并且我自己使用的源码库已经开源到了nuget,大家可以直接拿来做二次开发, 新版的下载地址为:http ...

  6. validator库在gin中的使用

    目录 封装语言包翻译器 tag中设置验证规则 控制层验 curl请求 返回结果 封装语言包翻译器 package validator import ( "fmt" "ne ...

  7. C数据结构线性表:实现顺序表的增删改查&完整篇

    文章目录 ①前言 顺序表结构体的定义 ②初始化顺序表 ③插入新的元素 插入的时候需要特别注意的几点 ④删除元素 第一个删除元素功能实现 第二个删除元素功能实现 对代码下面中**i- -**的说明(第二 ...

  8. Angular快速生成文件基本命令

    ng new 作用:创建一个已被初始化的Angular应用 命令选项 参数 说明 --collection -c 指定工程模板 属于高阶操作,暂不知道如何使用 --directory 指定新项目创建的 ...

  9. flask注册功能

    一个项目的简单结构划分 首先创建一个新项目 可以正常运行与访问 创建配置文件并添加配置. 将这里拆分到不同的文件中,让启动文件更加简洁. 创建一个apps包,导入配置模块,导入Flask,定义创建ap ...

  10. c++ RTTI Runtime Type Identification 运行阶段类型识别

    NoVirtualBase* NvirBase = new NovirtualDerivd(); NvirBase->print(); // auto nd1 = dynamic_cast< ...