2D ゲームで使用するシーン ツリーを実装しました。ツリー ノードには、変換と描画可能なオブジェクトが含まれています。
シーン ツリーは次のようになります。
Root
|
--------------------------
| |
Layer1 Layer2
| |
----------------- ---------
| | | | |
A B C F G
|
---------
| |
D E
シーンを描画するために、ツリーは最初に深さ優先順にトラバースされます。トラバーサル中、ドローアブルはレンダー キューに収集されます。次に、レンダ キューがレンダラーに渡されて処理されます。
ドローアブルは深さ優先の順序で収集されるため、これはレンダラーによって描画される順序でもあります。描画順序を変更するには、ツリー ノードを再配置する必要があります。たとえば、ノード G をノード F の前に描画したい場合は、それらを交換する必要があります。ノードを再配置する必要がないように変更したいと思います。代わりに、レンダラーはレンダー キューをそれ自体でソートできる必要があります。
問題:
兄弟ノードの各グループ ([A、B、C] または [F、G] または [D、E] など) は、階層が損なわれないように個別にソートする必要があります。ツリー ノードが直接ソートされている場合、これは問題になりません。ただし、ツリーがレンダー キューにフラット化されると、事態は複雑になります。
私の質問:
ノードの階層を乱さずにレンダー キューを並べ替えるにはどうすればよいですか?
この種の問題に対する代替ソリューションはありますか?
追加情報:
私が見つけることができる最良のリソースは、ブログ記事Order your graphics draw calls aroundです。複数の情報のチャンクから組み立てられた 64 ビット キーを使用して、レンダー キューを並べ替える方法について説明します。しかし、それは私が抱えている問題には対処しません。
ツリー ノードを直接ソートするだけで満足しないのはなぜかと疑問に思われるかもしれません。理由は 2 つあります。まず、懸念事項を分けておきたいからです。レンダラーが正しい順序でノードを描画するようにシーン ツリー内のノードを再配置しても、この目的には役立ちません。第 2 に、非表示のノード/ドローアブルをソートから除外することはできません (レンダー キューには、可視のドローアブルのみが含まれます)。