Drawcall 是衡量性能的一项重要指标,那么开发者应该很注重Drawcall的优化,严格遵从引擎的渲染规则进行优化。
目前优化Drawcall主要方式在于图集:
制作图集,可以有效的减低Drawcall,但不同图集之间会打断Drawcall的合并。
假设有A、B、C 三张图集。
节点结构1: AAABBBCCC,这样的排序下会产生3个Drawcall;
节点结构2: ABCABCABC,这样的排序下会产生9个Drawcall;
那么我们在制作过程中节点的排序需要尽量保证相同材质按照 结构1 紧挨着渲染,避免交叉渲染导致Drawcall无法合并。
但实际项目中有很多功能没办法按照 结构1 的方式排列,比如卡牌库、排行榜,通常会把Item制作成预制物,然后动态创建多个Item,这样的结构将是:
Item:AAABBBCCC
Item:AAABBBCCC
Item:AAABBBCCC
Item:AAABBBCCC
Item数量越多,Drawcall数量将成倍增长,以上将会产生12个Drawcall,希望这里无论多少个Item只产生3个Drawcall,这种奢求显然很难实现。
引擎能不能通过某种算法把那些同图集且显示不互相影响的节点合并Drawcall提交渲染?
或者是否能提供一个标记接口?让开发者可以自己标记那些节点进行批处理,默认不标记则按照现有的规则进行处理。
对于这一块,大家怎么想的?引擎底层还可以进行一波优化吗?