描画順の操作

複数のオブジェクトが部分的に重なり合っている場合、他のオブジェクトの前に表示されるオブジェクトがあります。これを描画順または Z 順序と呼びます。レイヤー N のオブジェクトは、レイヤー N-1 から 0 番のレイヤー・オブジェクトの前に配置されます。オブジェクトを 1 つのレイヤーから別のレイヤーへ移動することも、描画順に影響を与える 1 つの要因となります。
同じレイヤー内に複数のオブジェクトがある場合、これらのオブジェクトにも描画順があります。各レイヤーは、オブジェクトの位置を素早く決定できるクワッドツリーという空間的なデータ構造を持っています。デフォルトでクワッドツリーが有効になっており、最適なパフォーマンスを達成するために描画順が自動的に決定されるようになっています。この場合、描画順に影響を与えることはできません。
同じレイヤー内のオブジェクトに描画順を指定したい場合、次のメソッドを使用してレイヤーの Z 順序オプションをまず最初に有効にする必要があります。
   setZOrdering(boolean enable)
レイヤーの Z 順序が有効に設定されると、レイヤー内でオブジェクトの描画順を指定することができます。
   setIndex(IlvGraphic object, int index)
インデックスは常に 0 から N までの連続した範囲であることに留意してください。つまり、オブジェクトのインデックスを設定すると、他のオブジェクトのインデックスは +1 または -1 単位で指定されてインデックスの範囲が調整されます。現在のインデックスは、次のメソッドで取得できます。
   getIndex(IlvGraphic object)
Z 順序が有効になると、同じレイヤー内でインデックスの高いオブジェクトがインデックスの低いオブジェクトの前に表示されます。
メモ
異なるレイヤー間の描画順が各レイヤー内の描画順に優先します。つまり、数値の高いレイヤーのオブジェクトが数値の低いレイヤーの別のオブジェクトよりも前に描画されます。これは、たとえ最初のオブジェクトの Z 順序インデックスが 2 番目のオブジェクトの Z 順序レイヤーよりも低い場合でもです。言い換えると、Z 順序インデックスは、同じレイヤー内のオブジェクトの描画順のみを決定します。

上級者向けのシナリオ

基本的に、次の 3 つのシナリオがあります。
  • クワッドツリーが有効で、Z 順序が無効に設定されている。最も高いパフォーマンスが得られます。特に、ヒット・テスト (どのオブジェクトが指定位置にあるかを決定する) では理想的な速度を得られます。ただし、各レイヤー内での描画順を指定することはできません。
  • クワッドツリーが有効で、Z 順序も有効に設定されている。この設定は、重なり合っているオブジェクトの数によって、速度がやや落ちます。ヒット・テストではクワッドツリーを使用し、まだ十分な速度を得られます。描画順を完全に指定することができます。
  • クワッドツリーが無効になっている。Z 順序の設定 (有効/無効) に関係なく、同じ速度を得られます。ただし、クワッドツリーが有効に設定されているときに比べると、格段の差で遅くなります。クワッドツリーが無効になっているときも、描画順を指定することができます。
10000 個のオブジェクトで実測した結果、Z 順序が有効に設定されている場合、ヒット・テストでの減速度は平均して 1.2 から 5 の割合になりましたが、クワッドツリーを無効にすると、同じ結果が 20 から 70 の割合で減速しました。これはオブジェクトの数によって異なり、また、オブジェクト数が非常に少ない場合には無視されます。さらに、Z 順序が有効に設定されている場合、減速は主に重なり合っている深さ (同一場所で重なり合っているオブジェクトの数) によって影響を受けますが、その深さが深いほど、Z 順序を有効にしたときの減速度は高くなります。