Unity面板究极优化

         首先对于大项目来说UI首选一定的UGUI,目前没有啥可选的余地。多一点都是对性能的负担,UGUI底层基于多线程技术,可以有效分担压力,对于一些不是那么重的面板几乎无感。

        无论其他面板只是在此基础上修改的,但每多一层,计算机难免就得多一道计算,因此目前最优解一定是UGUI。

        这两天频繁的被问面板优化,该做的都已经做过了但还是不行,达不到要求该怎么办呢?

UGUI性能问题一般分为四种:

  1. Canvas  batch-build过长,通常是drawcall问题
  2. Canvas  Over-dirty 次数过多,频繁销毁创建
  3. 生成UI网格顶点时间过长
  4. 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即可(用户感觉不到就行了)

猜你喜欢

转载自blog.csdn.net/qq_46043095/article/details/132125999