【分享】利用PostRender实现分层合批渲染(附 Demo 和引擎源码解读)

深度优先换广度优先,会破坏遮挡关系,慎用

比如按原本逻辑,一个同级节点的所有子节点会先渲染(置于底层),用你的方案会导致这个节点的子节点后渲染(置于顶层)
遮挡关系破坏以后,事件分发顺序也要改,明显造成的问题更多

除非渲染树一开始就按广度优先设计,然而这有不符合直观逻辑,一个节点的所有子节点按直观应当被当做整体处理,也就是遍历父节点的过程会遍历所有子节点,这个只有深度优先符合

1赞

引擎组:“年轻人,你们考虑过的优化,我们都考虑过了,现在是最佳方案了 [抽烟]” :joy:

4赞

是的,会影响遮挡关系。所有子节点会永远处于所有父节点上。

能不能教一下怎么操作,我这边测试了没效果,2组相机分别渲染,层级没变

1赞

depth

一个节点还是一个摄像机,拆分不同节点不同摄像机

1赞

不同的group也会打断合批啊

1赞

大佬能写一篇教程,分享一下吗?相信很多人会喜欢看的,如果没时间,发个demo也行:grin:

1赞

drawcall 跟本文介绍的是一样的

这个要是 一个 节点下面 20个 子节点, 要分层 就要 20个 摄像机和分组 一一对应,这个 怎么感觉 大炮打蚊子一样的

其实 还是 有global zorder 就方便了 现在 就一个 本地的…确实也不方便

2.2.x的时候测试过,通过camera无法优化drawcall

我把所有用到同一个atlas的sprite对应node都放在同一个group,然后用多个camera渲染
打包成微信小游戏后,无果……

2.4.0的时代还没测过

我只是喜欢水贴罢了

同问能不能教一下怎么操作?

这边测试:

camera1 负责渲染 group1
camera2 负责渲染 group2

层级没变,没效果啊。 drawcall 没有变少。

你只要把不能动态合批的分层就行,比如 label 一层,其余所有一层,一共两层

麻烦确认下动态合批是否生效了: https://docs.cocos.com/creator/manual/zh/advanced-topics/dynamic-atlas.html

实测camera分层无效。

2.4.0版本源码:
_cullingMask 不影响节点的遍历顺序,遍历过程中不会根据 _cullingMask剔除节点,所以render-flow里会照样进行render步骤。render步骤里会去检查合批,所以在遍历的时候合批已经断了。
等遍历完后再按照_cullingMask逐层渲染,拿到的已经是没有合批的model了。

camera分组渲染 层级问题怎么解决:joy:

mark.

是的 确实不行