リソースの概要

Direct2D リソースは、描画に使用されるオブジェクトであり、 ID2D1GeometryID2D1RenderTarget などの Direct2D インターフェイスによって表されます。 このトピックでは、Direct2D リソースの種類と共有方法について説明します。

このトピックは、次のセクションで構成されています。

Direct2D リソースについて

多くのハードウェアアクセラレータ 2D API は、CPU に重点を置いたリソース モデルと、CPU で適切に動作するレンダリング操作のセットを中心に設計されています。その後、API の一部はハードウェア アクセラレータです。 これらの API を実装するには、CPU リソースを GPU 上のリソースにマッピングするためのリソース マネージャーが必要です。 GPU の制限により、状況ごとに一部の操作を高速化できない場合があります。 このような場合、リソース マネージャーは CPU レンダリングに移行できるように、CPU と GPU の間でやり取りする必要があります (コストがかかります)。 場合によっては、レンダリングが予期しない強制的に CPU に完全にフォールバックする場合があります。 さらに、単純に見えるレンダリング操作には、API で公開されておらず、追加の GPU リソースを必要とする一時的な中間レンダリング手順が必要になる場合があります。

Direct2D では、GPU を最大限に活用するためのより直接的なマッピングが提供されます。 リソースには、デバイスに依存しないリソースとデバイスに依存するリソースの 2 つのカテゴリが用意されています。

  • ID2D1Geometry などのデバイスに依存しないリソースは、CPU に保持されます。
  • ID2D1RenderTargetID2D1LinearGradientBrush などのデバイス依存リソースは、GPU 上のリソースに直接マップされます (ハードウェア アクセラレーションが使用可能な場合)。 レンダリング呼び出しは、ジオメトリからの頂点とカバレッジの情報と、デバイスに依存するリソースによって生成されるテクスチャリング情報を組み合わせることによって実行されます。

デバイスに依存するリソースを作成すると、デバイスの作成時にシステム リソース (GPU、使用可能な場合は CPU) が割り当てられ、レンダリング操作間で変更されません。 この状況により、リソース マネージャーが不要になります。 このモデルでは、リソース マネージャーの排除によって提供される一般的なパフォーマンスの向上に加えて、中間レンダリングを直接制御できます。

Direct2D はリソースを非常に制御できるため、さまざまな種類のリソースと、それらのリソースを一緒に使用できるタイミングを理解する必要があります。

Device-Independent リソース

前のセクションで説明したように、デバイスに依存しないリソースは常に CPU 上に存在し、ハードウェア レンダリング デバイスに関連付けられることはありません。 デバイスに依存しないリソースを次に示します。

ID2D1Factory (それ自体はデバイスに依存しないリソース) を使用して、デバイスに依存しないリソースを作成します。 (ファクトリを作成するには、 CreateFactory 関数を 使用します)。

レンダー ターゲットを除き、ファクトリによって作成されるすべてのリソースはデバイスに依存しません。 レンダー ターゲットは、デバイスに依存するリソースです。

Device-Dependent リソース

前の一覧で名前が付かないリソースは、デバイスに依存するリソースです。 デバイスに依存するリソースは、特定のレンダリング デバイスに関連付けられます。 ハードウェア アクセラレーションが使用可能な場合、そのデバイスは GPU です。 それ以外の場合は CPU です。

ほとんどのデバイス依存リソースを作成するには、レンダー ターゲットを使用します。 ほとんどの場合、ファクトリを使用してレンダー ターゲットを作成します。

デバイスに依存するリソースの例を次に示します。

  • ID2D1Brush と、それを継承するインターフェイス。 レンダー ターゲットを使用してブラシを作成します。
  • ID2D1Layer。 レンダー ターゲットを使用してレイヤーを作成します。
  • ID2D1RenderTarget と、それを継承するインターフェイス。 レンダー ターゲットを作成するには、ファクトリまたは別のレンダー ターゲットを使用します。

注意

Windows 8以降、デバイス依存リソースを作成する新しいインターフェイスがあります。 デバイス コンテキストとリソースが同じ ID2D1Device から作成された場合、ID2D1Device と ID2D1DeviceContext はリソースを共有できます。

 

関連付けられているレンダリング デバイスが使用できなくなると、デバイスに依存するリソースが使用できなくなります。 つまり、レンダー ターゲットの D2DERR_RECREATE_TARGET エラーが発生した場合は、レンダー ターゲットとそのすべてのリソースを再作成する必要があります。

ファクトリ リソースの共有

ファクトリによって作成されたすべてのデバイスに依存しないリソースは、同じファクトリによって作成された他のすべてのリソース (デバイスに依存しないリソースまたはデバイス依存リソース) と共有できます。 たとえば、2 つの ID2D1RenderTarget オブジェクトの両方が同じファクトリによって作成された場合、2 つの ID2D1RenderTarget オブジェクトを使用して同じ ID2D1RectangleGeometry を描画できます。

シンク インターフェイス (ID2D1SimplifiedGeometrySinkID2D1GeometrySinkID2D1TessellationSink) は、任意のファクトリによって作成されたリソースと共有できます。 Direct2D の他のインターフェイスとは異なり、シンク インターフェイスの実装はすべて使用できます。 たとえば、 ID2D1SimplifiedGeometrySink の独自の実装を使用できます。

レンダー ターゲット リソースの共有

レンダー ターゲットによって作成されたリソースを共有する機能は、レンダー ターゲットの種類によって異なります。 D2D1_RENDER_TARGET_TYPE_DEFAULT型のレンダー ターゲットを作成する場合、そのレンダー ターゲットによって作成されたリソースは、そのレンダー ターゲットでのみ使用できます (レンダー ターゲットが次のセクションで説明するカテゴリのいずれかに収まる場合を除く)。 これは、レンダー ターゲットが最終的に使用するデバイスがわからないため、ローカル ハードウェア、ソフトウェア、またはリモート クライアントのハードウェアにレンダリングされる可能性があるために発生します。 たとえば、リモートで表示された場合、またはレンダリング ターゲットのサイズがレンダリング ハードウェアでサポートされている最大サイズを超えると動作を停止するプログラムを作成できます。

次のセクションでは、あるレンダー ターゲットによって作成されたリソースを別のレンダー ターゲットと共有できる状況について説明します。

ハードウェア レンダー ターゲット

リモート処理モードに互換性がある限り、ハードウェアを明示的に使用するレンダー ターゲット間でリソースを共有できます。 リモート処理モードは、両方のレンダー ターゲットがD2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTINGまたはD2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE使用フラグを使用する場合、またはどちらのフラグも指定されていない場合にのみ互換性が保証されます。 これらの設定により、リソースは常に同じコンピューター上に配置されます。 使用モードを指定するには、1 つ以上のD2D1_RENDER_TARGET_USAGE フラグを持つレンダー ターゲットの作成に使用したD2D1_RENDER_TARGET_PROPERTIES構造の使用法フィールド設定します。

ハードウェア レンダリングを明示的に使用するレンダー ターゲットを作成するには、レンダー ターゲットの作成に使用したD2D1_RENDER_TARGET_PROPERTIES構造のフィールドを D2D1_RENDER_TARGET_TYPE_HARDWARE に設定します。

DXGI Surface レンダー ターゲット

DXGI サーフェス レンダー ターゲットによって作成されたリソースを、基になる同じ Direct3D デバイスを使用している他の DXGI サーフェス レンダー ターゲットと共有できます。

互換性のあるレンダー ターゲットと共有ビットマップ

レンダー ターゲットと、そのレンダー ターゲットによって作成された互換性のあるレンダー ターゲットの間でリソースを共有できます。 互換性のあるレンダー ターゲットを作成するには、 ID2D1RenderTarget::CreateCompatibleRenderTarget メソッドを 使用します。

ID2D1RenderTarget::CreateSharedBitmap メソッドを使用して、メソッド呼び出しで指定された 2 つのレンダー ターゲット間で共有できる ID2D1Bitmap を作成できます (メソッドが成功した場合)。 2 つのレンダー ターゲットが同じ基になるデバイスをレンダリングに使用している限り、このメソッドは成功します。