Unity DrawCall优化 - UGUI优化

一、DrawCall是什么?

Unity 展示出来的画面,是通过GPU绘制出来,才显示出来的。

在场景中,一个场景内的物体,分几个批次提交给显卡来绘制,就是几个DrawCall。

在Unity中,两个地方可以查看DrawCall,

1.在Game视口,的Stats,点击一下打开一个窗口,Batches:后面的就是Drawcall值。

2.运行时,在菜单栏Window->Analysis->Profilter.再打开的窗口中,点击Rendering,在底部蚕食信息中就会有Draw Calls:就是了。

 二、降低DrawCall为什么对性能有好处?

1.cpu:一次提交给GPU,会比多次提交的性能更好,省cpu;

2.gpu:吞吐量,一次性处理多少个面(Unity是三角面),每次提交的物体越多,GPU性能就更容易发挥。

三、UGUI降低DrawCall的方法

 没有优化前的DrawCall,如下图(可以看出目前消耗DC是14):

 3.1那么问题来了,如何查看UGUI占了几个DC呢?

其实很简单,就是运行时,通过隐藏UGUI来查看,Batches的值变化,比如下面操作:

没有隐藏前,查看是14个DC

隐藏后,查看是2个DC 

 说明了,我们这个UGUI界面,占用了14-2 = 12个DC,

其中这2个DC是什么呢?其实一个是天空盒一个是默认背景。

3.2UGUI如何降低DC呢?

合并DC要满足几个条件:1.shader得一样;2.纹理对象要一样;满足了这两个条件才能合并到一个DC。

在这里界面的DC有12个,主要原因是每个图都是单独的,每一次渲染都是单独的DC,

要想减少他们的渲染,可以将他们打入到同一个图集中,然后在绘制UGUI的时候,根据纹理坐标,找到对应的小图。

这样,在同一图集中,就满足了同一个纹理,同一个shader,可以合并为一个DC了。

3.3如果打图集呢?

UGUI常用优化DC的手段,就是将GUI图片打成图集

3.3.1.开启图集模式

在菜单栏Edit--> Project Settings-->Editor-->EditorSettings-->Sprite packer;

将Sprite Packer 的 Mode 设置为 Always Enabled;

 这样设置即可。

3.3.2 指定哪些图片打入到同一个图集

注意:博主用的是Unity2020版本,在这之前的版本(2019以前),以上设置后,PackingTag即可使用了,但是在Unity2020 之后,需要在添加一个包2DSprit

2DSprit包添加,

        3.3.2.1 在菜单栏Window-->Package Manager,打开该界面后,选择Unity Registry,

然后在下面列表中即可看到2DSprite ,点击Install安装即可。

在图片中有一个 PackingTag ,将所选图片,

        3.3.2.2 然后手动创建一个Sprite Atlas文件

在Project视图右键,Create>2D>Sprite Atlas。

        3.3.2.3 添加要打包的图片或文件夹

将要打包的图片或文件夹,放置到图集文件的Objects for Packing中。然后单击PackPreview按钮,可以看到图集预览。 

 然后点击 Pack Preview 即可查看图集内容了。

 打好图集后,再次运行,看下DC情况(DrawCall为4):

 减去天空盒和背景的两个,4-2=2就是2个DC.

3.3.3 为什么这个界面占用了2个DC呢?

仔细看下这张图

其实是文字(Text)和图片各占了一个DC,所以是2个。

3.4 Text的主要原理与DC的影响

 Text对于Unity来讲,底层用的和Image是同样的shader;

也就是说 Text --> Image 是一样的,就是文字贴图;

Unity的Text的核心原理:

        通过Text组件 + 矢量字库 + 字体大小 +文本内容   来生成一个 贴图;

        最后Unity底层把文本当贴图对待,只不过这个贴图不是image,而是通过Text组件,绘制到一个纹理贴图对象上的。

Unity对Text的处理:

        再上图里可以看出,有多个Label,但只形成了1个DC。

        Unity在处理多个Label的时候,尽可能的将文字绘制到一个纹理里(当然这里受纹理图集的大小限制),跟文本内容和字体的大小、字号、样式没有关系。

四、RawImage对DrawCall的影响

RawImage 与 Image有什么区别?

1.RawImage支持Sprite + Texture,Image只支持Sprite;

2.RawImage支持设置UV坐标,Image不支持;

3.Image支持做一些其他效果(比如九宫格),RawImage单独占用一个DC,无法合并DC(即使是同一图集,不同图片,是不能合并的)。

4.RawImage会打乱DC的渲染顺序(如果RawImage影响了正常的DC渲染,以RawImage为节点,DC会拆分)

...

猜你喜欢

转载自blog.csdn.net/u013774978/article/details/130278485