我已经实现了一个用于2D游戏的场景树。树节点包含转换和可绘制对象。
这就是场景树的样子:
Root
|
--------------------------
| |
Layer1 Layer2
| |
----------------- ---------
| | | | |
A B C F G
|
---------
| |
D E
为了绘制场景,首先以深度优先的顺序遍历树。在遍历期间,将drawable收集在渲染队列中。然后将渲染队列传递给渲染器进行处理。
当drawable以深度优先顺序收集时,这也是渲染器绘制它们的顺序。要更改绘图顺序,我必须重新排列树节点。例如,如果我想在节点F之前绘制节点G,我必须交换它们。我想改变它,以便不再需要重新排列节点。相反,渲染器应该能够自己对渲染队列进行排序。
问题:
每组兄弟节点(例如[A,B,C]或[F,G]或[D,E])必须单独排序,以使层次结构保持不变。如果树节点直接排序,这不是问题。但是,如果树被展平为渲染队列,事情会变得复杂。
我的问题:
如何在不干扰节点层次结构的情况下对渲染队列进行排序? 是否有针对此类问题的替代解决方案?
其他信息:
我能找到的最好的资源是博客文章Order your graphics draw calls around。它解释了如何使用从多个信息块组合的64位密钥对渲染队列进行排序。但它并没有解决我遇到的问题。
您可能会问为什么我不满足于直接对树节点进行排序。原因有二:首先,我想将问题分开。重新排列场景树中的节点以便渲染器以正确的顺序绘制它们将不利于此目标。其次,不可能从排序中排除不可见的节点/ drawable(而渲染队列只包含可见的drawable)。