首先对于大项目来说UI首选一定的UGUI,目前没有啥可选的余地。多一点都是对性能的负担,UGUI底层基于多线程技术,可以有效分担压力,对于一些不是那么重的面板几乎无感。
无论其他面板只是在此基础上修改的,但每多一层,计算机难免就得多一道计算,因此目前最优解一定是UGUI。
这两天频繁的被问面板优化,该做的都已经做过了但还是不行,达不到要求该怎么办呢?
UGUI性能问题一般分为四种:
- Canvas batch-build过长,通常是drawcall问题
- Canvas Over-dirty 次数过多,频繁销毁创建
- 生成UI网格顶点时间过长
- GPU片元着色器利用率过高
UGUI的drawcall是由c++完成的,因此对于同一个canvas下的图片我们要尽可能采用合批,无论它是静态合批还是动态合批,以降低drawcall,提高效率
合批的过程:
根据UI面板的深度进行排序
检查UI面板图片的遮盖关系
检查材质对于相同材质进行合批
以上这些是在unity里c++部分完成的,因此对于轻量级的面板,打开一般无感,能够很流畅的打开
通常UGUI打图集是一招遮百丑的技术方案,很好用,效率也非常高
为了避免面板卡钝出现问题,优化好UI,因此在搭建面板之前一定要竖立好规矩:
1、动静分离。建立两个Canvas面板将会动态绘制,可能触发重构的面板与静态面板分离
2、将所有可能打断合批的面板移到最下层,做好面板互斥,避免无用UI面板重叠出现
3、不使用Layout组件,最好自己用代码做好管理
4、Canvas的RenderMode尽量使用Overlay模式
5、不使用Text组件,使用TMP(TextMeshPro)组件代替
6、尽可能关闭面板上无用的组件系统,(比如关闭Raycast Target,尽量仅在最下一层面板开启)
7、对于嵌套的Canvas,OverrideSorting属性会打断射线,可以降低层级遍历
8、对于UI对象查找尽量不使用Find来进行查找,做好标签进行查找
9、美术图片尽量不要带有透明部分,图片制式要能被2整除
10、至少要简单了解UGUI特性和字体问题
11、字体不要太小,否则可能会导致频繁重建
12、使用Font.RequestCharacterInTexture进行字体预加载,降低启动时间
13、对于不可见UI不要使用UI的透明度进行开关显示,因为它实际上依然在绘制
14、非全屏对话模式合理的使用OnDemandRendering接口,合理降频
15、优化UI Shader剪裁,根据需要合理剔除多余部分
16、对于背包商城部分合理使用对象池和动态图集,合理缓存
17、分帧加载背包商城
18、合理设计好面板的打开方式,对重型界面提前缓存
19、使用RectMask2D组件剪裁,剔除不必要部分渲染,使用规则的滑动列表
20、终极大招,找美术削图片质量,找策划削功能(没治只能这么干了)
21、适当重新设计面板的打开方式,减轻压力和负担
22、也可以根据UGUI源码自己改一套自己的UI管理模式框架
以上即是规矩,也是UGUI优化的要点
如果这些都做了,那可能还得排除考虑下其他部分设计是否合理,是不是因此影响了面板,出现了卡顿
非战斗,影响不到用户体验可以不做优化,一般帧数不少于20-30即可(用户感觉不到就行了)