コンポジションサーフェス
Note
Windows 10上のアプリの場合は、DirectComposition ではなく Windows.UI.Composition API を使用することをお勧めします。 詳細については、「 Visual レイヤーを使用してデスクトップ アプリをモダン化する」を参照してください。
このトピックでは、Microsoft DirectComposition でサポートされるサーフェスの種類について説明します。
DirectComposition 論理サーフェス
DirectComposition は、 IDCompositionSurface オブジェクトを公開して、論理コンポジション サーフェスを表します。 DirectComposition は、これらの論理サーフェスの作成、更新、削除に使用できる API を公開します。 各サーフェスは、1 つ以上のビジュアルに関連付けることができます。 アプリケーションは、論理サーフェスの有効期間を管理する役割を担います。
論理サーフェスの更新
アプリケーションは、 BeginDraw を呼び出し、アプリが更新する論理サーフェス上の四角形のサイズとオフセットを指定することで、論理サーフェスを更新できます。 DirectComposition は、指定したサイズの四角形を割り当て、サーフェスと、アプリケーションが描画または更新するために必要な対応するオフセットを返します。 更新四角形の制限は、サーフェス サイズによってバインドされます。 たとえば、40 x 100 ピクセルサーフェスの更新四角形は、最大 (0,0,40,100) にすることができます。 また、更新可能な領域はガード四角形によって適用されます。 一度に 1 つのガード四角形しか存在できないため、一度に更新できる論理サーフェスは 1 つだけです。 BeginDraw に 対する前回の呼び出しの後に EndDraw または SuspendDraw が呼び出されていない場合、 BeginDraw はエラー コードを返します。 アプリケーションは、コミットされた呼び出しを BeginDraw にバッチに追加できますが、 EndDraw が呼び出されてコミットされるまでは有効になりません。
論理サーフェスに対する更新の中断
異なるサーフェスを更新する必要があるアプリケーションでは、現在の更新で SuspendDraw を呼び出し、 BeginDraw を呼び出して新しい更新を開始できます。 Microsoft DirectComposition では複数の更新が許可されますが、一度にアクティブにできるのは 1 つだけです。 つまり、次のサーフェスで BeginDraw を呼び出す前に、あるサーフェスで SuspendDraw または EndDraw を呼び出す必要があります。 EndDraw とは異なり、コミットされたバッチには SuspendDraw 状態のサーフェスを含めることができますが、EndDraw が呼び出されるまで、このような更新は画面に表示されません。
論理サーフェスの更新を再開する
アプリケーションは、ResumeDraw を呼び出すことによって、SuspendDraw 状態のサーフェスへの更新を再開できます。 このメソッドは、中断されたサーフェスでのみ呼び出すことができます。
論理サーフェスの更新を終了する
EndDraw と Commit を呼び出すことは、画面上でビットマップ更新の変更を表示する唯一の方法です。 EndDraw を呼び出すたびに、ガード四角形を削除するには、BeginDraw への対応する呼び出しが必要です。 論理サーフェスでは、 Commit が呼び出されるまで、すべての更新が保持されます。 EndDraw は暗黙的な再開/終了であるため、SuspendDraw 状態のサーフェスで EndDraw を呼び出すこともできます。 EndDraw を呼び出すと、更新されたコンテンツが画面に表示され、破棄され、更新プログラムのメモリを後で更新するために再利用できるようになります。
論理サーフェスの使用例
次の例では、アプリケーションが 2 つのビジュアルで構成されるビジュアル ツリーを作成し、ビジュアルに関連付けられている 2 つの論理サーフェスの特定の領域を更新する必要がある場合に実行する手順について説明します。
- DirectComposition デバイスを作成します。
- ルート ノードとビジュアル 1 と 2 で構成されるビジュアル ツリーを作成します。
- 論理サーフェス 1 と 2 を作成します。
- SetContent を呼び出して、論理サーフェスをビジュアル 1 と 2 に関連付けます。
- 論理サーフェス 1 のサブ四角形で BeginDraw を呼び出します。
- DirectComposition によって返されるオフセットのサーフェスを更新します。
- 省略可能な手順:
- 論理サーフェス 1 で SuspendDraw を呼び出します。
- 論理サーフェス 2 のサブレクトで BeginDraw を呼び出します。
- DirectComposition によって返されるオフセットのサーフェスを更新します。
- 論理サーフェス 2 で EndDraw を呼び出します。
- 論理サーフェス 1 で ResumeDraw を呼び出します。
- DirectComposition によって返されるオフセットのサーフェスを更新します。
- 論理サーフェス 1 で EndDraw を呼び出します。
- Commit を呼び出 します。
DirectComposition 仮想サーフェス
DirectComposition は 、IDCompositionVirtualSurface インターフェイスを公開して仮想サーフェスを表します。これは、固定サイズのタイルを持つ固定グリッドに配置された論理サーフェス (タイル) のコレクションです。 アプリケーションは、作成時に仮想テクスチャのサイズを指定します。 サイズによって、仮想サーフェスの境界が確立されます。 サーフェスは、1 つ以上のビジュアルに関連付けることができます。
仮想サーフェスが初期化されるとき、仮想サーフェスは実際の割り当てによってサポートされません。 つまり、ビットは保持されません。 DirectComposition は、アプリケーションがサーフェスの更新を開始した後にタイル (つまり、コンポジション サーフェス オブジェクト) を割り当てます。 アプリケーションは 、BeginDraw を呼び出し、仮想サーフェスの座標に関して目的の領域を指定することで、仮想サーフェスを更新します。 次に、DirectComposition は更新を保持するために必要なタイルを割り当て、更新するコンポジションサーフェスとオフセットを返します。
論理サーフェスと同様に、仮想サーフェスで BeginDraw、 SuspendDraw、 ResumeDraw 、 EndDraw を呼び出すことができます。 さらに、DirectComposition は、既存の仮想サーフェスのサイズ変更とトリミングに使用できるメソッドを公開します。
仮想サーフェスのサイズ変更
Resize メソッドは、仮想サーフェスの境界を変更します。つまり、新しい更新または割り当ては、新しいサイズによって設定された境界に収まる必要があります。 アプリケーションは Resize を 使用して、仮想サーフェスの特定の領域が不要になり、再利用できることを DirectComposition に伝えます。 Resize によって仮想サーフェスが縮小された場合、アプリケーションは新しい境界外のリージョンを更新できなくなります。
次の図は、3 対 3 の仮想サーフェスのサイズが 2 バイ 2 に変更されたことを示しています。 赤い領域は、サイズ変更操作の一部として破棄されるタイルを表し、メモリは DirectComposition によって再利用されます。 サイズ変更後、アプリケーションは仮想サーフェスのサイズを再び変更せずに赤い領域を更新できません。
サイズ変更操作はすぐに有効になります。 DirectComposition は、アプリケーションが Commit を呼び出してサイズ変更を更新するまで待機しません。 たとえば、アプリケーションが次の一連の呼び出しを行うとします。
pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();
この例では、アプリケーションは最初のサイズ変更時にすべてのコンテンツを失います。 2 番目のサイズ変更は、 Commit の前に呼び出された場合でも効果はありません。 この場合、画面には何も表示されません。
仮想サーフェスのトリミング
Trim メソッドは、アプリケーションで必要な仮想サーフェスの領域を識別します。 仮想サーフェスの境界のサイズは変更されませんが、現在割り当てる必要がある論理サーフェスを DirectComposition に指示します。
次の図では、緑色の四角形がアプリケーションのビューポートです。 アプリケーションは、最初に、ビューポート内にある仮想サーフェスの最初の 6 つのタイル (青) (薄い灰色) にレンダリングされます。 仮想サーフェスによって表されるページがスクロールすると、アプリケーションは最後の 6 つのタイルをレンダリングする必要があります。 アプリケーションは Trim を呼び出して、最後の 6 つのタイルで定義された領域がコンテンツの場所であり、残りは現時点では必要ないことを示します。 DirectComposition は、最初の 6 つのタイル (濃い灰色) を最初に表した論理サーフェスをリサイクルすることを選択できます。
関連トピック