关于渲染次序的一个想法

昨天同事遇到了一个比较奇葩的需求:一个列表,每行里有若干个item。这列表有个列标头,就像Excel那样,选中了列标头后,会有一个竖条的半透明高亮图出现。
然后问题来了,这个高亮图如果盖在最上面,会盖住item。垫在最下面,会被每一行的底框挡住。
也就是说,按设计图,这个高亮竖条其实是需要放在item和item行的底框之间的。

这本质是渲染次序和节点树结构的冲突问题,和很多人热烈讨论,很多大佬写了不少东西出来做的那个背包合批渲染其实是类似的。

我想到,问题的关键其实是,我们用来做移动、布局等控制的节点树结构,和用于渲染的树结构,一般在游戏引擎里是只有一个树。
所以,如果将这两个树结构分开会不会好一点?

就像ccc里node的anchor。在别的一些引擎或者编辑工具里,会分出anchor和pivot。
现在很多人讨论时提到想要一个设置渲染次序,提到的一些方案无非是设计一个值表示先后次序,这种方式等于将渲染节点排到了一个数组中,操作起来其实不是很方便。
如果渲染次序也是一个树结构,只是和我们编辑时的树结构分开单独存在,那么这个树的使用就方便多了。
当然了,分开一个渲染树的最大问题,是怎么去初始化。一般来说,为了方便,渲染树按我的想法,是会随着逻辑树的结构自动生成,这没什么问题,不做额外操作的话,其实和目前的情况一样。
然后有些背包之类的结构里,可以通过修改这个渲染树去优化渲染次序。
但是问题是改变了渲染树之后,这棵渲染树不和原本的结构对应了,这时候再有新的对象创建,该怎么去自动分配到渲染树中?

如果全局再单独弄一个树,两个树之间的同步会增加额外的工作,不太好。
可以先把问题的场景范围窄化。
首先,3D部分的渲染,有自己的渲染队列,本身就不是按照场景树结构排序,所以不需要一个新的渲染树。
然后,主要是2D和UI部分,大部分情况下,节点树和渲染的顺序一致就够用了,没有必要修改。
那么我们就可以把问题的范围归结到,部分UI树下的节点,需要控制顺序。
解决方案就可以做一个组件,挂在需要对子节点控制顺序的UI部分的节点上,由这个组件内部来实现一个渲染树,来规范这个节点下的子节点。修改范围后,这个渲染树可以作为一个插件,而不需要引擎全局修改加渲染树。。
在问题范围缩小的情况下,同步就会比较简单,新对象创建按顺序默认挂到该渲染树的直接孩子下,然后再手工调整这部分就可以了,因为范围比较小,所以就少数的地方手工调整也可以接受。

1赞

好主意,不用为整个场景做一整个渲染树,只在有需要的部分为根节点添加渲染树组件,然后再调节控制。

show me your code