Unity UI优化
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:
- 每个需要使用对象池的对象都需要继承对象的基类对象,便于重载和区分,并区别初始化。
- 销毁时对对象池接口回收,不要重复或忘记回收,因此在设计的过程中就要统一接口。
- 场景结束时及时销毁对象池,避免内存驻留。
- 对象池应该是可伸缩的,在实例化对象超出对象池大小时自动扩充池子大小,在实例化对象不频繁和少量时可以缩减容量。
九、UI贴图优化
问题:倒入贴图资源时,贴图的某些属性或数据其实并不是必要的,但要占用很大的空间,不合理的贴图大小也会增大资源占用。
解决方案:导入贴图资源时注意事项:
- alpha通道是否需要
- 2次方贴图大小
- 读写权限是否需要
- minimal是否需要
- 合适的压缩方式。
上述过程可以通过unity editor扩展asset importer pipeline的方式自动化管理,可以通过Texture Importer类控制指定导入路径的图片具体设置。
《Unity高级编程》读书笔记
Unity UI优化的更多相关文章
- Unity UI性能优化技巧
本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- 关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题
有时候会发现 Unity UI 非常耗时,在 Profiler 中可以轻易的看到 UI 中 的 GraphicRaycaster.Raycast 单帧调用可以成百上千,甚至好几千,帧速率前不忍赌,一关 ...
- Unity全面优化
前言 Unity的项目优化已经是老生常谈,很多人在项目完成之后,即便创意新颖,也会觉得差强人意,原因就在于没有做详细的项目优化.众所周知,Unity是一个综合性的3D开发引擎,其中包含图像渲染,逻辑处 ...
- Unity 性能优化(力荐)
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...
- Unity动画优化
Unity动画优化 https://blog.csdn.net/TracyZly/article/details/79991593 Unity中Animator做UI动画的一些细节 https://b ...
- Unity项目优化——Web版
Unity项目优化--Web版 大家好,这是小黑第一次写文章(哈哈哈哈哈,好激动),我好好的写,有不对的地方多多指出. 首先呢是版本介绍,不过好像版本对于优化没有影响: 不过还是要告诉大家我用的版本: ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- Unity性能优化(1)-官方教程The Profiler window翻译
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...
随机推荐
- DataWorks 功能实践速览03期 — 生产开发环境隔离
简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同 ...
- NopCommerce支持多种类型的数据库
本文章的内容是根据本人阅读NopCommerce源码的理解,如有不对的地方请指正,谢谢. 阅读目录 1.类结构关系图 2.分析 3.NopCommerce应用 类结构关系图 分析 NopObjectC ...
- 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 ...
- Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目
Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 每博一文案 有句谚语说:"一怒之下踢石头,只有痛着脚趾头." 比一件糟糕的事情更可拍的,是你用糟糕的态度 ...
- 使用Elasticsearch在Rails中进行全文本搜索
使用Elasticsearch在Rails中进行全文本搜索 参考: https://blog.csdn.net/cunjie3951/article/details/106921108
- Linux下vim的常用命令总结
vim按d表示剪切 按dd剪切一行 vim命令:命令模式 /关键字 n继续向下查找 vim的多行注释: 1.按ctrl + v进入 visual block模式 2.按上下选中要注释的行 3.按大写字 ...
- ibus 输入法导致输入卡顿的解决方案
系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...
- Windows server 2012 R2开机进入cmd,关闭后黑屏
出现此问题,一般只有两种情况,操作系统装置前和操作系统装置后出现: 第一种: 装置操作系统的时候没有选择"Windows Server 2012 R2 Strandard( 带有GUI的服务 ...
- log4j的配置详解
参考文章:https://www.jianshu.com/p/ccafda45bcea 引入log4j: 在项目中单独使用log4j进行日志的输出: maven依赖: <dependency&g ...
- Win10-常用cmd命令与快捷键
以下全部是本人私认为平时经常用到的指令,持续更行中- 常用快捷键 win + R : 输入cmd回车,打开命令提示符界面 win + E : 打开文件资源管理器(俗称:文件夹) win + S : 搜 ...