多数の長方形があり、一部は他の長方形と重なっています。各長方形には、絶対 z オーダーと色があります。(各「長方形」は、実際にはパーティクル エフェクト、メッシュ、またはテクスチャの軸に沿ったバウンディング ボックスであり、半透明の場合があります。しかし、他の長方形の背後にある長方形をカリングしようとしない限り、色付きの長方形について抽象的に考える方が簡単です。 、だから私は問題の説明でそれを使用します:)
「色」を変更するコストは非常に高くなります。2 つの異なる色の四角形を描くよりも、2 つの青い四角形を続けて描く方がはるかに高速です。
画面上にない四角形を描画するコストも非常に高く、避けるべきです。
2 つの長方形が重ならない場合、それらが互いに相対的に描画される順序は重要ではありません。zオーダーが重要なのは、それらが重なっている場合のみです。
例えば:
1(赤)と4(赤)はまとめて描けます。2 (青) と 5 (青)、3 (緑) と 7 (緑) を一緒に描くこともできます。ただし、8 (赤) は 6 (青) の後に描画する必要があります。したがって、3 つの赤をすべて一緒に描いて青を 2 つのセットで描くか、すべての青を一緒に描いて赤を 2 つのセットで描くかのどちらかです。
また、長方形の一部が時々移動する場合があります。(すべてではありません。静的であることがわかっている四角形もあれば、移動することがわかっている四角形もあります。)
このシーンを JavaScript/webGL で描画します。
JavaScript のカリング コードと GPU によるカリングの適切なトレードオフを考慮して、色の変化を最小限に抑えるために、適切な順序で四角形を描画するにはどうすればよいでしょうか?
(どの長方形が重なり、どの長方形が表示されているかを調べるだけでも費用がかかります。私は基本的な四分木を持っており、これによりシーンの描画が非常に高速になりました(シーン全体の描画操作を単に発行する場合と比較して); 問題は、OpenGL を最小限に抑える方法です。状態が変化し、可能な限り属性配列を連結します)
更新問題を説明し、ソリューションのデモンストレーションの基礎として役立つ非常に単純なテストアプリを作成しました: http://williame.github.com/opt_rects/
ソースコードは github にあり、簡単にフォークできます: https://github.com/williame/opt_rects
完全なゲームで見られる問題を実際に再現するのに十分な状態変更を備えた小さなテスト アプリを作成するのは難しいことがわかりました。ある時点で、状態の変更には十分なコストがかかる可能性があることを考慮する必要があります。また、空間インデックス (デモでは四分木) と全体的なアプローチを高速化する方法も重要です。