UGUI合批
简介
通过本篇你能处理好大部分UI多余的drawcall,以及本人在项目过程中处理drawcall的经验(算不上啥哈哈!),Drawcall越多会造成Cpu过载,减少drawcall是优化的大头,希望本篇能对你产生帮助。
什么是Drawcall
简单来讲就是Cpu通过图像编程接口向命令缓存区添加命令,让Gpu通过缓存区获取命令处理。难的我也讲不来.
如何减少Drawcall
通过分析帧画面和打断合批的问题来解决
如何查看项目中的drawcall
Unity FrameDebug
一目了然,Unity真是太棒了,你能通过它知道Unity是怎么绘制图像的
UnityProfiler
yyds!一下子就能知道被打断,图中显示的就是因为图集不同,那么如何让图集相同呢,那么就可以用到精灵图集了,什么?!你说精灵图集是什么,那你接着往下看
精灵图集
哎呀!一下子让我说精灵图集什么什么什么的,我怎么说的完,我们就针对问题来学习,上面说到它被打断合批的理由是图集不同,那么我们就让他图集相同不就解决问题了吗,那么如果让他们相同呢,那就使用精灵图集,将sprite打包成一个大的图集
精灵图集的使用
- 创建图集
-塞入图片
-打包图集
Drawcall减少实战经验
-接下来请看使用图集减少了多少从14到5个
接下来我们分析能不能再少点–(是不是丧心病狂了,哈哈!通常界面10个左右是正常的),但是为了教学我必须丧心病狂!
1:通过分析器我发现都是纹理不同造成的,第一我们以及打了图集,那么纹理为什么不同呢,
2:通过帧调试器发现是文字Text 是存储在Font Texture的,所以导致不能合批,这个不可避免,但是却可以优化,直接往下看合批规则
合批规则
简介
这个百度真的一大堆我随便抄个吧,但是实战的却比较少,他们随便拿几个图,就开始教了,我接下来直接通过一个项目的界面来分析,简单来讲就是先计算层级号,再计算材质,再计算纹理
下图 两个drawcall都是同一个Font Texture但是没有被合批,因为计算层级时将他们分离了,那么什么是层级呢?在相叠的两张图片中,会优先渲染被叠在下面的那张,然后在渲染上面那张,如果两个图片的材质,纹理相同那么他们同为一个层级(就会被合批为一个drawcall),否则都是不同层级(从0开始加1),下图中,两个材质相同纹理相同,但是由于层级不同导致不能合批,所以我们要想办法让他们相同
就是我不能传视频只能靠图和白话让你们尽量懂
下图中蓝色箭头和红色箭头分别为两个层级,可以明显的看到红色箭头的文字没有压到下面的灰色底图,但是蓝色箭头就压到了,所以导致了他们层级不同,解决方法就是将文字下移,压到灰色地图就解决了–补充一下–{在大背景的上面存在文字和图片并相互不接触的情况下,文字的渲染优先于图片}
Z轴 旋转
其实可以简单的理解成 UI不能与canvas成为异面,必须与canvas紧紧贴合
材质和纹理
材质一定要一样,纹理也要一样,纹理不一样可以通过图集来解决,老项目可以用texturepacket
深度–此深度不是合批的深度计算
深度的话,如果有兴趣的通过UGUI源码可以MaskableGraphic所继承的Graphic的抽象类内部有一个depth的只读属性。通过访问它你可以得到该UI的深度
到此Drawcall从14个到4个,希望大家能点个赞,不懂的话就多看看,可能是我表述的不好!