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

引擎组:“年轻人,你们考虑过的优化,我们都考虑过了,现在是最佳方案了 [抽烟]” :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了。

1赞

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

mark.

是的 确实不行

测试2.4是不能通过摄像机分层合批的,并且只要加了额外摄像机,即使未被任何摄像机渲染的节点也会打断合批。