Unity UI减少DrawCall的学习笔记

摘要:

        DC是什么:在unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。

也就是说,有多少个DC,CPU就需要向GPU发送多少次通知,次数越多性能影响越大,所以在开发项目时,DC的个数是需要严格控制的。本章是博主对UI模块DC的减少方法的学习记录,适合新手小白,博主会详细写出步骤方法,如果已经是大神的话,本章内容相对菜鸡,但还是期望有大神看到的话,有所建议或指教的话尽情在评论区提出,在此感激不尽。如果对大家学习有所帮助的话,点个小赞赞鼓励一下新手博主喔。

一、如何查看DC

1.如果单纯要看个数的是,可以点击Game视图State,如下图可以直观看到DC的次数。

Batches:合批的意思。

 2.如果要看到每个DC分别渲染啥东西的话,就点击上方菜单栏Window->Analysis->Frame Debugger,如下图会弹出一个Frame Debug窗口。

 选择左边的每一个选项,从上到下可以看到到这一步时渲染出了啥玩意。

上图是一个空场景的DC截图,场景只有一个摄像机,现在是有2个DC。由上图得知,这两个DC是Camera导致的,我们验证一下关闭Camera,发现现在就是0个DC了。

二、使用图集

在制作UI界面的时候,图片无疑是使用频次最多的对象之一。在不使用图集的情况下,我们可以看到一张图片放上去就会有一个DC,但是同一张图片不论多少张放上去都是一个DC,原理的话,我在这边不多做赘述,但通过这个实验可以看出如果可以把多张图片变成一张图片的话,这就能大大减少DC的次数了,这时候图集的功能就非常奈斯了。

  

 图集是什么,可能有些同学还不会用,简单来讲,图集就是可以把多张小图打成一张大图,可以在Project窗口右键点击Create->SpriteAtlas就能生成一个图集,将你想要的图片或者放置图片的文件夹拉进图集的Objects for Packing,就能将图片自动打成图集,如下图。

 

△注意:

1.要使用图集的话需要把ProjectSettings里的SpritePacker打开,如下图。

 2.图集里的图片不要超过图集最大尺寸。当前图集的大小在下方可见,如上图就是当前图集只有64*32这么大,最大尺寸看上方Max Texture Size,默认是2048,就是图集最多能达到2048*2048的,超过的部分不会被打成图集。

博主当前验证是否超过图集的方法有点蠢,但是应该是有用的。就是如果你觉得图集好像满了,害怕超出的话,就把Max Texture Size改大一个level,比如原先2048改成4096,这时候如果已经超过一半,那就是溢出了,这时候你就要根据当前项目资源考虑要加大尺寸还是新建一张图集,还是将大一点的图片压小一点,让图集容量不要溢出,不然DC就会蹭蹭蹭爆涨了,这当然不是我们所期望的。

这时候注意,不要为了减DC,让图集过大,因为图集越大所占的内存就越大,如一张2048*2048的图集是4M,一张4096*2048的就是8M了,我们要综合考量项目的需求,平衡两者关系。

如下图所示,三张图片(同一张图集)也只占了一个DC。

 三、文本

△注意:

1.与图片一样,同一个字库的文本只占一个DC,所以一个界面最好统一一个字库。

2.因为对象是一层一层渲染出来的,若有如果文本和图像有所重叠的话,也会增加DC的次数。

 如上图,如果文本在图片的上层,就算与图片重合也不会增加DC,但如果换一下层级关系,如下图

文本在两张图片的重叠处,就算两张图片是一张图集的也是会多增加一个DC的。

因为DC简单来说是这样算的,如果是同一层同个材质是会同时渲染的,这算一个DC。如果有不同材质的对象插入就会打断合批进而增加DrawCall。

     

如上左图,如果文本不在两张图片的交叠处只是覆盖在一张图片上方,这时候两张图片依旧算一个DC,文本单独算一个DC。上右图,有一个文本在重叠处,一个文本在最上层,这样每一个对象都算一个DC了。

 大家也可以看一下Frame Debug的合批情况就可以大致推算出是什么原因了。因为虽然文本叠在图片上边,但是并没有在他们的交叠部位,所以两张图片还是算1个DC的。

所以在不改变美术效果的前提下,最好把所有文本统一放在一个层级上边(我会习惯让文本处于最顶层),这能有效减少DC。如下图,跟原先的效果一样,但是DC少了2个。

三、Canvas

如果使用Canvas组件来调整UI对象的层级,但是一个Canvas就会增加1个DC,慎用。

 四、其他

和文本一样,我们用大图,Mask(遮罩)或者在使用材质球等等的东西时,都会增加一个DC,这时候要注意一下尽可能不要打断图集的合批,要及时关注合批情况进行调整

五、总结

综上所述,主要还是要看Frame Debug,具体问题具体分析。

暂时先记录以上优化方法,之后有其他方式会继续补充调整。

猜你喜欢

转载自blog.csdn.net/wang980502/article/details/127173427
今日推荐