yukamu 发表于 2022-6-27 20:22

Unity UGUI合批

1.同一层级相邻的两个image会根据 材质和图片信息是否相同来判断是否可以合批,如果相同,不会改变image的深度信息,将被放到一个批次里面。
2.同一层级里面的相邻两个image如果材质或者图片不同将不会合到一个批次里面,相对处于下面位置一点的图片的深度信息会增加1。
3.如果不能合批的两张图片的mesh的有重叠,将会打断合批操作,增加一个drawcall。
4.使用Image的Tiled模式会回增加mesh的数量,相当于直接拷贝多个相同的图片进行平铺,会增加顶点数,可以使用RawImage代替,图片格式需要设置成default,且选择repeat模式。




5.使用Mask组件会增加DrawCall,因为Mask的内部处理机制使用不同的材质对显示区域进控制,并且处于mask下面的子部件的显示区域和mesh大小不会有任何的改变,子物体在遮罩外面也同样会产生DrawCall。Mask组件需要挂载在包含Image的组件下面,可能会产生无用的DrawCall。可以使用RectMask2D代替。RectMask2D会将不在遮罩范围内的图片剔除掉,不进行渲染。 RectMask2D的子物体不会和外面层级的图片进行合批,但Mask的子物体可以和外面层级的物体合批。根据情况具体选择使用哪个。




6.Canvas 下的图片,文字等元素发生改变时会将整个canvas进行重绘,增加性能消耗,所有在使用时可以根据情况进行资源的动静分离成动态canvas或者静态canvas进行挂载。建议同时存在不要超过4个。canvas不会打断原来的合批而是每个canvas下的物体会进行新的合批计算。可以在动态部件上直接挂载canvas,如下图



UGUI性能优化 减少DrawCall


[*]一个完整界面使用到的图片尽量打成一个图集,多个界面公用的图片打成一个图集,注意图集和图集之间不要有图片冗余


[*]图集设置信息 及分类






[*]动态打图集 假设多个图集 每个图集有100多张图片或更多但每个图集只用到了其中一个或者几个图片 就浪费了很大资源 可以选择动态打图集,将某几张图片动态生成一个图集
动态打图集Git地址 https://github.com/DaVikingCode/UnityRuntimeSpriteSheetsGenerator
4.不需要产生交互的图片和文字尽量去掉RayCastTarget

页: [1]
查看完整版本: Unity UGUI合批