有关于优化时,代码生成node合批的迷幻表现,求帮助

版本:2.2

场景如图所示,每个建筑就是一个node,而建筑的图片、建筑的阴影、建筑的绿色底盘 是分开的,而调试了两天也没有解决这三个合批的问题。

逻辑是这样
创建建筑的整体node—>标记需绘制建筑图片—>标记需绘制建筑底盘—>标记需绘制建筑阴影,也就是说建筑创建的时候并没有实际加载任何图片

等待所有建筑完成,在update中遍历所有建筑,开始加载图片(图片加载时为同步操作,图片已预存在内存中,同时,建筑图片、阴影、底盘 都分别是静态图集)。

如果有某个建筑有绘制建筑图片的标记,则此次update只加载所有的建筑图片,完成后去掉建筑图片标记。

同理,底盘和阴影一样的方式,这样的处理方式为了保证 同一时间在做同一个类型的加载操作,也就是为了保证合批。

建筑buildNode关系是
建筑图片 buildNode._sprite
底盘 buildNode._bottom
阴影 buildNode._bottom._shadow

神奇的地方来了,如果三个加载注释掉其中一个,就能实现合批,三个全打开就会导致drawcall崩到一千多。
3个加载同时打开
image

2个加载

放上log证明加载操作是批量的

@jare @panda

中间哪个材质打断合批了吧

解决了,这个问题出在
底盘 buildNode._bottom
阴影 buildNode._bottom._shadow

这两个都用了 _bottom 这个node,会导致不能合批

改为
底盘 buildNode._bottom
阴影 buildNode._bottomShadow
不能使用同一个node

这样的node关系能正确合批

这意味着如果场景元素较多的时候,又是代码生成的node,需要每一个元素不能嵌套,既一个node一个sprite,不要addchild。

可以参考这个节点树遍历的例子,你的算法需要所有对象都在同一个父节点下,然后按顺序添加。其实更好的方式是设置节点的 zIndex(在 3.0 中移除了,需要设置 UITransform 组件的 priority)

1赞

感谢panda大佬的回复
我应该是有用zindex的,也不清楚自己用没用您说的方式,因为建筑是需要前后排序的,难道写的排序正好实现了zindex方式的合批

虽然建筑是个buildNode,但是我没有把建筑图片、底盘或阴影 加入到建筑buildNode中,而是直接add到了地图root中,buildNode中对其他持有引用而已
然后在update中持续刷新位置,如果buildNode的位置改变了,那么就改变 建筑图片、bottom、shadow的位置,并排序。

大佬您说的是我这个方式吗

zIndex 只在同一个父节点下有效,你之前的描述应该是有嵌套节点,那么父子节点关系仍然是更优先的

也就是说,尽管我分开操作,批量的加载图片给
A.B
A.C
A.C.D
B 和 C能正确合批
但因为父子关系,而打断了D的合批,那这样我就理解了,谢谢大佬指点迷津

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。