NGUI源码分析(七) Panel,Widget,DrawCall 三者之间的关系
2017-05-03 17:53
615 查看
前几篇介绍了分别介绍了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
测试非常简单:
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
相关文章推荐
- NGUI源码分析之----UIDrawCall
- 源码分析NGUI的DrawCall合并原理
- 源码分析NGUI的DrawCall合并原理
- Nginx源码分析-4个重要结构之间的关系
- Storm-源码分析- Component ,Executor ,Task之间关系<转>
- android开发步步为营之79:通过源码分析Looper,Handler,MessageQueue之间的关系
- 【NGUI源码剖析】深入理解NGUI的drawcall
- 【NGUI源码剖析】NGUI如何优化drawcall数量
- SSCLI中GC源码分析(1) - EE与BCL之间的调用接口FCall
- Spring源码分析之Aop中拦截器,适配器,通知之间的关系
- 源码分析Looper、Handler、Message之间的关系
- Nginx源码分析-4个重要结构之间的关系
- quartz源码分析之深刻理解job,sheduler,calendar,trigger及listener之间的关系
- 从源码中分析Handler, Looper, Message, MessageQueue之间的关系
- SSCLI中GC源码分析(1) - EE与BCL之间的调用接口FCall
- Storm-源码分析- Component ,Executor ,Task之间关系
- silverlight Canvas、StackPanel、Grid三者之间的关系
- android的消息处理机制(图+源码分析)——Thread,Looper,MessageQueue,Message,Handler之间的关系
- Canvas、StackPanel、Grid三者之间的关系
- silverlight Canvas、StackPanel、Grid三者之间的关系