Manager > マネージャーの基本機能 > 描画タスクの最適化
 
描画タスクの最適化
特別なメンバー関数により、複数のジオメトリー操作を実行して、すべての変更が終わった後で再描画することができます。これは、無効とされた矩形から構成された領域である更新領域を使用して実装します。
更新領域は、オブジェクトに対する変更を行う前に適当な領域を格納します。また、これらの変更がそれぞれのビューに対して実行された後に、該当する領域を格納します。
アプリケーション・タスクを正常に適用するには、関連するオブジェクトが無効として配置されている領域にマークを付けて、関数を適用してから、オブジェクトが現在配置されている領域を無効にします。このメカニズムは、IlvManager クラスのメンバー関数セットにより簡素化されています。更新される領域は、IlvManager::reDrawViews が呼び出された場合にのみリフレッシュされます。つまり、マネージャーのビューのリフレッシュは、IlvManager::initReDraws および IlvManager::reDrawViews のサイクルの中で再描画対象の領域にマークを付けることにより実行されます。
これらのサイクルを入れ子にすることにより、最後に IlvManager::reDrawViews メンバー関数を呼び出した場合のみ、実際に表示を更新するようにできます。
描画タスクの最適化に役立つ IlvManager メンバー関数は次のとおりです。
*IlvManager::initReDraws - 管理対象の各ビューの更新領域を空にして、描画最適化操作の先頭にマークを付けます。この手順が完了すると、描画指示への直接または間接呼び出しが延期されます。各 IlvManager::initReDraws に対しては、IlvManager::reDrawViews の呼び出しは 1 回のみです。 そうでない場合は、警告が発せられます。IlvManager::reDrawViews への最後の呼び出しがなされるまで実際のリフレッシュが行われないように、IlvManager::initReDraws への呼び出しを埋め込むことができます。
*IlvManager::invalidateRegion - 領域に無効としてマークを付けます。この領域は後で再描画されます。IlvManager::invalidateRegion を呼び出すたびに、領域がすべてのビューの更新領域に追加されます。
*IlvManager::reDrawViews - 全更新領域に対して描画コマンドを送信します。IlvManager::invalidateRegion への以前の呼び出しに関連するすべてのオブジェクトが更新されます。
*IlvManager::abortReDraws - 遅延した再描画のメカニズムを中断します (たとえば、全画面をリフレッシュする必要がある場合)。この関数は、空にする更新領域をリセットします。必要に応じて、IlvManager::initReDraws を呼び出して再スタートします。
*IlvManager::isInvalidating - マネージャーが IlvManager::initReDraws/IlvManager::reDrawViews 状態の場合、IlTrue を返します。
IlvManager::applyToObject メンバー関数では、これらのメンバー関数の連続使用のメカニズムが使用されています。実際の呼び出しは次のようになります。
manager->applyToObject(obj, func, userArg, IlTrue);
 
これは次と等しくなります。
manager->initReDraws();
manager->invalidateRegion(obj);
manager->applyToObject(obj, func, userArg, IlFalse);
manager->invalidateRegion(obj);
manager->reDrawViews();
 
IlvManager::invalidateRegion メンバー関数はパラメーターに指定されたオブジェクトのバウンディング・ボックスと連動します。オブジェクトに適用された操作がそのバウンディング・ボックスを変更すると、IlvManager::invalidateRegion を操作の前後に 1 回ずつ、合計 2 回呼び出す必要があります。
たとえばオブジェクトの移動の場合、そのオブジェクトが最初にあった領域と最終領域を無効にして、オブジェクトを再描画できるようにする必要があります。オブジェクト・バウンディング・ボックスが変更されていない場合は、IlvManager::invalidateRegion の呼び出しは 1 回しか必要ありません。

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.