赞
踩
Unity 展示出来的画面,是通过GPU绘制出来,才显示出来的。
在场景中,一个场景内的物体,分几个批次提交给显卡来绘制,就是几个DrawCall。
在Unity中,两个地方可以查看DrawCall,
1.在Game视口,的Stats,点击一下打开一个窗口,Batches:后面的就是Drawcall值。
2.运行时,在菜单栏Window->Analysis->Profilter.再打开的窗口中,点击Rendering,在底部蚕食信息中就会有Draw Calls:就是了。
1.cpu:一次提交给GPU,会比多次提交的性能更好,省cpu;
2.gpu:吞吐量,一次性处理多少个面(Unity是三角面),每次提交的物体越多,GPU性能就更容易发挥。
没有优化前的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个。
Text对于Unity来讲,底层用的和Image是同样的shader;
也就是说 Text --> Image 是一样的,就是文字贴图;
Unity的Text的核心原理:
通过Text组件 + 矢量字库 + 字体大小 +文本内容 来生成一个 贴图;
最后Unity底层把文本当贴图对待,只不过这个贴图不是image,而是通过Text组件,绘制到一个纹理贴图对象上的。
Unity对Text的处理:
再上图里可以看出,有多个Label,但只形成了1个DC。
Unity在处理多个Label的时候,尽可能的将文字绘制到一个纹理里(当然这里受纹理图集的大小限制),跟文本内容和字体的大小、字号、样式没有关系。
RawImage 与 Image有什么区别?
1.RawImage支持Sprite + Texture,Image只支持Sprite;
2.RawImage支持设置UV坐标,Image不支持;
3.Image支持做一些其他效果(比如九宫格),RawImage单独占用一个DC,无法合并DC(即使是同一图集,不同图片,是不能合并的)。
4.RawImage会打乱DC的渲染顺序(如果RawImage影响了正常的DC渲染,以RawImage为节点,DC会拆分)
...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。