1.合并的规则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去测试一下就清晰明白了~
有漏的也麻烦各位补充下~!小弟像各位学习!
大神看到的话嘴下留情~~~~只是想分享一下心得,给正在学习creator或者在这方面有疑问的小伙伴~有说错的麻烦指正下~同时也希望引擎组能对creator的渲染合并这一块做出更多的优化,或者开放API接口,方便开发者根据项目的需求自行调整策略~
谢谢