NGUI源码分析(七) Panel,Widget,DrawCall 三者之间的关系

前几篇介绍了分别介绍了Panel,Widget,DrawCall等,但是它们之间的关系具体是怎样的没有仔细讲,下面通过一个测试来说明它们之间的关系。

测试非常简单:

1.新建一个UIRoot ,添加几个Panel和几个Sprite,结构如下:

其中sprite1-4分别属于4个不同的图集

点击UIRoot的Panel属性下的"Show Draw Calls"会发现此时panel的DrawCall总数量为5个 

 

2.把UIRoot下面的Sprite1拖到Panel下面

点击Panel下的"Show Draw Calls" 此时panel的DrawCall总数变成了为4个 

 

界面的显示效果一模一样,为什么把Sprite1拖到Panel下draw calls数量减少一个呢?研究后发现这是因为NGUI为了减少DrawCall数量,每一个Panel会把相同材质的widget的drawcall合并。Panel下面的两个Spirte1都使用图一个图集,Panel把这两个Sprite的DrawCall合在一起了,所以DrawCal总数变成了4个.(实际上是不止要材质相同,贴图和shader也要相同,这里为了方便统称材质了)

下面再做一个修改,把Panel下的两个Sprite1的深度一个设置为0,一个改为2:

点击Panel下的"Show Draw Calls" 此时panel的DrawCall数又变成了为5个 了

 如果把两个Sprite1的深度都设置为0,或着一个设置为0一个设置为1,DrawCall数就会变回4。这是什么原因呢?这是因为DrawCall合并的条件除了材质要相同,Widget的深度也必须要相同或者相邻。如果两个Widget中间隔了1个其他图集的Widget,也是不能合并的。

Panel Widget DrawCall 三者之间的关系如下:

注:一个Panel包含了5个Widget,Widget后面的那个数字表示深度,比如Widget2表示深度为2,widget1,widget2,widget3的都引用相同的材质Material1而且深度相邻,满足DrawCall合并条件,所以他们都共同使用一个DrawCall.Widget4的材质跟其他4个不一样,所以自己使用一个DrawCall.Widget5虽然也引用了Material1,但它的深度和Widget3中间隔了个Widget4,不相邻,所以要使用一个新的DrawCall.

原文地址:http://www.cnblogs.com/rocky300/articles/4682910.html

猜你喜欢

转载自blog.csdn.net/Marccco/article/details/84637313