Unity3d 如何优化UGUI

前言:游戏中UI会由很多图片(sprite)组成,如果每个图片都是一个单一的文件,那么在绘图的时候都会使用一个drawcall(老版unityGUI的深坑),而大名鼎鼎的NGUI对其进行了优化使用了atlas的图集原理进行了合并图集减少drawcall。而当我们再次使用UGUI的的时候你当然不会忘了需要打包图集这个工作。下面说说打包图集的一些东西~~以及遇到的问题。

  • 如何打包图集?

首先你需要开启打包图集的功能,具体如下图
这里写图片描述
UGUI 的sprite packer 功能是需要开发者关注这个sprite tag(点到任何一个图片会看到这个设置)的值,这个值就相当于我们的图集名称,设置了对应的图集后点击pack 即可生成对应的图集。需要说明的是,如果你的同一个sprite tag下有多个压缩类型的图片,那么他会给你生成对应多个的不同格式的图集。比如你的同一个sprite tag下有argb的和16bit的图片那么他会给你生成对应的图集。

ok 这里有个需要注意的地方是打包的压缩规则,如果你选择的是TightPackerPolicy 那么他的图集排列会更加紧凑,但是缺点是在android机上会有截图不干净的问题。这点如果换成DefaultPackerPolicy可以完美解决。
这里写图片描述

  • 如何自动设置sprite tag?

下面说说sprite tag的值需要怎么自动化来进行设置,我们的做法是放到不同的文件夹中,然后每个文件夹会有不同的格式的图片,一般分为truecolor 和 16bits的(有比这个更好的做法,这里不介绍了)

  • 如何使用assetbundle热更新呢?

上面我们介绍了如何生成对应的图集,那么我们其实把对应的图集设置成对应的bundle id 就可以了,跟设置单张图片没有任何区别,只是使用的时候需要特别注意下,因为你要很清楚的知道这些图片放在那个图集里面的。这里其实要说明的是并不是我们所有的图片都需要知道对应的图集名字,因为我们在打包UI的时候会依赖到你的atlas的名字,而这部分静态的图片是不需要知道的,我们需要知道的就是动态加载的那部分图片的atlas名字,一般来说动态加载的图片会配置到一个图片的列表里面,只需要在对应的策划表里面添加一个这个图片属于那个atlas即可。也许你会说这个还不够,因为atlas这个名字是很容易被改动到的。的却是这样,UI肯定是反反复复的去修改,那么我们可以在加载的时候智能点去判断如何智能呢?伪代码如下

if(传了对应的图集){
if(图集加载成功)处理逻辑
else if 从内存中加载已经存在的图集(静态绑定的图集)
else 图片无法处理
} else{
if(单图能否找到) 可以加载
else if (从内存中加载已经存在的图集)(静态绑定的图集)
else 图片无法处理

当进行了如上的操作后你会发现你的drawcall值有明显的下降。

  • 为什么我的关卡界面会非常的卡 ?

这个问题我估计很多做技术的会遇到,可能他们会认为是管卡的图标太多了,有好多屏,还有连线等等乱七八糟的东西,咳咳,当然这个是一个很小方面的原因,事实上并不是主要原因。主要原因是因为在我们的3d游戏里面一般来说主城都会是一个3d的而且是3d相机,而ui都是2d相机在照射,当我们打开这种关卡界面的时候其实3d相机还在给gpu进行传输绘制的任务,只是我们的2d相机的设置为depth 而已,所以只需要你在这种全屏的UI打开的时候关闭你的3d相机你就会发现即使你的管卡有几百个应该也不会有卡顿了。

- 如何定位我们的绘制会不会很多内容?
这个问题其实你可以通过profiler 的GPU 和 render 这两个选项进行曲线监控,而事实上我最关注的还是untiy 5x 的新功能 Frame debugger 这个功能,可以看到我们每帧渲染的东西,效果非常明显,统计也非常到位。可以试下

猜你喜欢

转载自blog.csdn.net/pdw_jsp/article/details/68946450