Unity中的Mask组件增加DrawCall的原因

Unity中的Mask组件增加DrawCall的原因

简介

  • 常说mask组件不要常用,因为会增加drawcall,增加性能消耗;当然作为一个需要背八股文的同学而言,仅仅知道会增加性能消耗是不够的,所以这里简单看下其原理。

首先看下在Unity中实验的UI层级结构
在这里插入图片描述
通常,mask组件的使用,是在一个父节点上添加mask组件,然后可以对子节点进行裁剪,也就是子节点超出父节点的部分会被裁剪掉。

增加DrawCall

通常使用mask组件,最少会增加两个drawcall,还有4个的情况,下面介绍

增加两个drawcal的原因

- 首先,我们看下mask节点的实现原理,通过调试功能FrameDebug,可以发现,mask组件是使用了模板测试,这里将模板的使用参数ref设置为1

在这里插入图片描述

- 这里将模板的使用参数ref设置为1,绘制的条件是Equal,也就是模板值为1的地方才绘制,否者舍弃掉像素值

在这里插入图片描述

  • 最后,清空模板的ref值,Stencil Pass的值是0,也就是把模板的值设置为0

在这里插入图片描述
所以增加了两个Draw Call, 两个Draw Call来至———1、需要设置模板区域,2、第二个是需要清空模板值。

增加4个的情况

当这些ui可以合批的时候,中间增加一个使用mask组件的ui对象,会打断合批,所以原来的一个合批就会变为三个,再加上mask组件增加的两个dp,总共就是4个dp,如下所示

- 使用了mask组件

在这里插入图片描述

- 没有使用mask组件

在这里插入图片描述

总结

Unity中的UI组件使用了mask,至少会增加2个DrawCall,如果打断原本的合批,增加的Drawcall数量就会大于2个。

猜你喜欢

转载自blog.csdn.net/qq_41841073/article/details/128336434