原因
最近因为某个需求需要在UI上同时使用大约25个Mask组件,这些Mask对象以及被Mask的对象都是一样的
实验过程
因为担心过多的Mask会增加不少的渲染负担,特意测试了下怎么处理可以稍微减少dc的调用。理论上如果不能进行合批的话,对于每个Mask对象,开启模板一个dc,渲染被Mask对象一个dc,关闭模板一个dc,那么总共需要25* 3个dc。所做的测试也很简单,因为在UI上都是同一个材质,第一次测试是把所有的对象(测试用例4个)都堆叠在一起,打开FrameDebug看了下是使用了12个dc,和预期一样。测试对象都是Mask是100* 100的Image,被Mask的对象是200*200.测试用图:
场景
FaemeDebug
可以看到每个对象都没有进行合批,所以消耗了12个dc.
然后我们将4个对象分别移开位置,让他们没有彼此交叉(有三种情况,一种是mask对象不交叉,一种是包括子节点都不交叉,还有一种mask和另一个对象的被Mask的对象不交叉)
首先是只是mask对象没有交叉,结果如图:
结果仍然是消耗了12个dc
然后让他们的mask对象与其他对象的被Mask对象不交叉,结果:
可以看到,这时只用了3个dc就把4个对象绘制结束,而且从FrameDebug看到第一个dc就是用来开启模板缓冲,第二个dc就是绘制4个被mask的对象,最后一个dc就是关闭模块缓冲
最后让4个对象完全不交叉,我没有特意去做了,显然结果会跟上述结果一样,只需3个dc就可以绘制完。
结论
因此如果需要使用多个这样的Mask对象时,尽量避免当前对象的Mask对象与其他对象的被Mask的对象有交叉。
扩展
关于UGUI的对象交叉时,这时候关于合批的处理是怎样的,需要了解一下。