描画タスクの最適化

マネージャーに備わった特別機能で、ジオメトリー操作実行後に行う描画タスクのコストを最小化できます。これは作業結果を見る場合などに便利です。この機能は、更新領域という表示の未検証部分を使用します。更新領域には、オブジェクトの変更を実行する前の適切な領域と、各ビューに対する変更が実行された後の関連領域が格納されています。
該当する関数を正常に適用するには、オブジェクトが無効として配置されている領域にマークを付けて、関数を適用してから、関連するオブジェクトが現在配置されている領域を無効にします (関数を適用するとオブジェクトの位置が変わることがあります)。この機構は、 IlvManager クラスのメソッド・セットにより大幅に簡素化されます。更新領域は、メソッド reDrawViews が呼び出されたときにのみ更新されます。つまり、initReDrawsreDrawViews のサイクルで再描画する領域にマークを付けると、マネージャーのビューが更新されます。
これらのサイクルを入れ子にすると、最後に reDrawViews メソッドを呼び出した場合のみ、実際に表示を更新するようにできます。描画タスクの最適化に役立つ IlvManager メソッドは次のとおりです。
  • 管理する各ビューの更新領域を空にして、描画最適化操作の先頭にマークを付けます。この手順を実行すると、描画指示への直接または間接呼び出しが延期されます。各 initReDraws に対して、reDrawViews の呼び出しは 1 回のみです。そうでない場合と、警告が発せられます。reDrawViews への最後の呼び出しがされると、実際に更新されるように、initReDraws への呼び出しを組み込むことができます。
  • 新規領域を無効として定義します。つまり、その領域は後で再描画されます。invalidateRegion を呼び出すたびに、領域がすべてのビューの更新領域に追加されます。
  • 全更新領域に対して描画コマンドを送信します。invalidateRegion への以前の呼び出しに関連するすべてのオブジェクトが更新されます。
  • 遅延した再描画のメカニズムを中止します (例えば、全画面を更新する必要がある場合)。この関数は、空にする更新領域をリセットします。必要に応じて、initReDraws を呼び出して再スタートします。
  • マネージャーが initReDraws/reDrawViews 状態の場合は、true を返します。
このメカニズムは applyToObject メソッドで使われます。
実際の呼び出しは次のようになります。
manager.applyToObject(obj, func, userArg, true);
これは次のようになります。
manager.initReDraws(); 
manager.invalidateRegion(obj);
manager.applyToObject(obj, func, userArg, false); 
manager.invalidateRegion(obj); 
manager.reDrawViews();
invalidateRegion メソッドはパラメーターとして指定されたオブジェクトのバウンディング・ボックスと連動します。オブジェクトに適用された操作がそのバウンディング・ボックスを変更すると、invalidateRegion を 2 回呼び出す必要があります。例えば移動操作の場合、オブジェクトが移動前にあった場所の初期領域を無効にしてから、最終領域を無効にして、オブジェクトを再描画できるようにする必要があります。背景の変更など、他の状況の場合は、必要なのは操作後の呼び出しのみです。