一、UI元素合并的规则AABBCC:
ABC三个节点里分别里面都有sprite,AA代表两个节点里的图是一样的,或者是来自同一个图集(Atlas)。这样的节点排序情况下,会产生3个drawcall,如果是ABABAC,这样的排序是6个drawcall。如果想减少drawcall就尽量用含相同图集的节点排序相邻,或者包含子同一个节点里,中间不能有label或者不同图集或者不同的纹理,否则渲染会被打断。
2.第二个坑rgba不一样,类型不一样,都不会进行渲染合并,drawcall自然会高居不下,比如sprite的type不一样,一个是sliced,一个是simple,是不会合并到一起的,就算两个sprite是来自同一个图集,也是分两次渲染,算两个drawcall…所以,想要两个节点甚至两百个节点只产生一个drawcall…只能让他们都是同一个type的sprite,type都是simple或者都是xxx…并且来自同一张图集的,或者是同一个纹理(同一张图),最后,他们的节点树中,这两百个节点,中间不能包含有label、或者其他的纹理和其他图集的图等,否则渲染就被打断了,就可能会产生2个3个…甚至200个drawcall,drawcall的多少关键在于节点包含的sprite在渲染的过程中,你在他们相邻的节点中,哪里打断了他们,打断后,如果后面的sprite全是一样的,他们还是会进行渲染合并的,只是中间被中断了。比如:
AAABAAA ------> 这样是算3个drawcall
AABAAAA -------> 这样也是算3个drawcall
AABABAA -------> 这样就算5个drawcall
小结:渲染合并很容易被打断…太难了像背包、游戏战斗场景,怪物多,或者是背包的物品里包含的纹理多等等的情况下,drawcall会很高掉帧的情况就会很严重,不过也看手机~像iphoneXS,就算400 drawcall也不会有很直观的感受~ 中低端手机就惨了,卡成狗。 我也是自己用demo去测试了一下,模拟了下现在做的项目的情况,找出了项目的瓶颈所在,上面的看不懂小伙伴或者新手建议自己去用一个简单的demo去测试一下就清晰明白了~
二、UI元素资源位置:
对于一个界面的UI所用的的资源要放在一个单独的文件夹内,这样可以打包在一个图集内,加载速度快。
三、UI动态修改尺寸:
对于需要在代码中动态修改尺寸的UI元素,不要在编辑时设置UI的尺寸