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翻 ...
随机推荐
- 尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码
在加上热重载时,源代码生成 Source Generator 的默认行为会让 Visual Studio 有些为难,其原因是热重载会变更代码,变更代码触发代码生成器更新代码,代码生成器更新的代码说不定 ...
- Django之路由层、视图层、模板层介绍
一.Django请求生命周期 1.路由层urls.py Django 1.11版本 URLConf官方文档 1.1 urls.py配置基本格式 from django.conf.urls import ...
- 还需要学习JDBC吗?如果需要该了解到怎么样的程度?
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家在工作中还有没有写过JDBC,我在大三 ...
- 四、【转】基于知识图谱的推荐系统(KGRS)综述
以下文章来源于AI自然语言处理与知识图谱 ,作者Elesdspline 导语 本文是2020年针对知识图谱作为辅助信息用于推荐系统的一篇综述.知识图谱对于推荐系统不仅能够进行更精确的个性化推荐,而且对 ...
- 03.Java 基础语法
1. 注释.标识符.关键字 三种注释 单行注释:// 多行注释:/* 多行注释 */ 文档注释: /** * @Description HelloWorld * @Author xxx */ 标识符 ...
- WEB服务与NGINX(20)- nginx 实现HTTP反向代理功能
目录 1. nginx实现反向代理功能 1.1 nginx代理功能概述 1.2 NGINX实现HTTP反向代理 1.2.1 HTTP反向代理基本功能 1.2.1.1 反向代理配置参数 1.2.1.2 ...
- GESP 202312 游记
day 0 把一本通上的指针扫了一遍,睡觉! day 1 9:00入场,在第二个考场. 冲进昌平二中,码了Hello,World!. 9:30发网址,开题 监考老师居然说阅读程序题可以打代码!···· ...
- C 语言编程 — 基本数据类型
目录 文章目录 目录 前文列表 数据类型 基本数据类型 整型 浮点型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> 数据类型 数据类型,即数据对 ...
- Android 12(S) MultiMedia Learning(九)MediaCodec
这一节来学习MediaCodec的工作原理,相关代码路径: http://aospxref.com/android-12.0.0_r3/xref/frameworks/av/media/libstag ...
- 如何查看Linux的系统信息?
在Linux服务器上,可以通过几个简单的命令来查看操作系统的详细信息. 1.使用uname命令获取操作系统基本信息,包括内核名称.网络节点名称.内核版本.架构等. uname -a 2.查看`/etc ...