次の方法で共有


デバイス リソースの管理

更新 : 2007 年 11 月

マネージ モバイル Direct3D プログラミングのリソースには、デバイスのリセット時に再作成が必要なリソースと、それ以外のリソースという、2 つの基本タイプがあります。オブジェクト型によって、デバイスのリセット時にデータが格納されるかどうかが異なります。デスクトップ コンピュータ アプリケーションの Direct3D とは異なり、リソース作成に使用されるメモリ プールは、デバイスのリセット時にリソースを作成する必要があるかどうかに関係ありません。

メモリ プール処理

マネージ モバイル Direct3D プログラミングでは、次の 3 つのメモリ プールを使用できます。

  • システム

    モバイル デバイス上の通常のシステム メモリ内に割り当てます。一般的に、ビデオ メモリよりも使用速度は遅くなります。

  • モニタ

    モバイル デバイス上のビデオ ハードウェアによって主に使用されるメモリ領域を割り当てます。デバイスによっては、ビデオ メモリは非常に制約の大きいリソースです。

  • マネージ メモリ

    システム メモリのキャッシュとして、ビデオ メモリを割り当てます。ドライバがキャッシュ処理方法を実装するアルゴリズムとしては、LRU (Least Recently Used) 交換アルゴリズムなど数種類のアルゴリズムが考えられます。

    テクスチャなどのリソースがマネージ プールに作成されると、システム メモリ プール内では空間がそのテクスチャ用に割り当てられます。SetTexture メソッドを使用してテクスチャがテクスチャ ステージに割り当てられると、テクスチャはビデオ メモリ プールにアップロードされ、最も使用頻度が低いアイテムとなるまで保持されます。その後、別のリソースのための空き領域を用意するために削除されます。ビデオ メモリにマネージ面をアップロードするための空き領域が必要となったとき、LRU 定義を満たすアイテムがない場合、ドライバは Priority プロパティを使用して、ビデオ メモリから削除するマネージ メモリ リソースを決定する必要があります。

    マネージ プール内に VertexBufferIndexBuffer、および Texture の各リソースを作成することはできますが、前面バッファ、バック バッファ、深度バッファ、およびイメージ面を作成することはできません。

SurfaceCaps 構造体のインスタンスを使用することにより、リソースの作成時にアクセス可能なメモリ プールを特定できます。

モバイル デバイスでは、サポートされているメモリ プールがリソースの種類によって異なる場合があります。ディスプレイ ドライバでマネージ リソース プールがサポートされているかどうかは、SurfaceCapsSupportsManagedPool プロパティによって示されます。このプロパティが true の場合、そのデバイスでは VertexBufferIndexBuffer、および Texture の各リソースに対してマネージ プールがサポートされています。ドライバでマネージ プールがサポートされていない場合、アプリケーションでマネージ プールから面を作成することはできません。テクスチャ用にシステム メモリ プールとビデオ メモリ プールの両方がデバイスでサポートされている場合、アプリケーションでは、UpdateTexture メソッドを使用して独自のメモリ キャッシュ方式を実装できます。

アプリケーションで ResourcePreLoad メソッドを使用すると、ビデオ メモリに面を強制的にプリロードさせることもできます。このメソッドによって、必要なバイトが破棄され、面が直ちに読み込まれます。

さらに、DeviceResourceManagerDiscardBytes メソッドを使用することで、マネージ リソースに指定されたバイト数分を強制的に破棄させることもできます。このメソッドでは、破棄するバイト数を引数として設定します。アプリケーションからゼロを渡すと、ビデオメモリ内のすべてのマネージ バイトが破棄されます。

リソース マネージャを制御するすべてのメソッドは、直ちに動作し、コマンド バッファにバッファされません。また、デバイスでマネージ プールがサポートされていない場合は、失敗します。

オブジェクトのインスタンスと有効期間

デバイスのリセットを管理し、インデックス バッファまたは頂点バッファを使用するときは、適切な有効期間が設定されたオブジェクトが作成されるように、適切なコンストラクタを使用する必要があります。

Windows Mobile Direct3D では、Smartphone または Pocket PC 上に Device インスタンスを一度に 1 つだけサポートします。すべての Direct3D デバイス リソースを削除するために ManagerReleaseD3DMobile 静的メソッドを使用できるため、別の Windows Mobile Direct3D アプリケーションを同じ Pocket PC または Smartphone 上で起動できます。

Device のリセット時に再作成する必要のあるオブジェクトは次のとおりです。DeviceReset イベントのイベント ハンドラで、再作成を実行できます。

Device のリセット時に再作成する必要のないオブジェクトは次のとおりです。

Font オブジェクトおよび Sprite オブジェクトでは、デバイスのリセットに応じて必要なすべてのアクションを自動的に実行します。

IndexBuffer オブジェクトおよび VertexBuffer オブジェクトは、デバイスのリセット時に自動的に自分自身を再作成しますが、オブジェクト内部にデータは格納されていません。デバイスのリセット後、インデックス バッファまたは頂点バッファにデータを設定するように、IndexBuffer.Created イベントまたは VertexBuffer.Created イベントのイベント ハンドラを定義できます。

参照

その他の技術情報

.NET Compact Framework での Mobile Direct3D プログラミング