次の方法で共有


Surface メモリへの直接アクセス (Direct3D 9)

IDirect3DSurface9::LockRect メソッドを使用して、サーフェス メモリに直接アクセスできます。 このメソッドを呼び出すと、pRect パラメーターは、直接アクセスするサーフェイス上の四角形を記述する RECT 構造体へのポインターです。 サーフェス全体をロックするように要求するには、pRect を NULL に設定 します。 また、サーフェスの一部のみをカバーする RECT を指定することもできます。 2 つの四角形が重なり合っていない場合、2 つのスレッドまたはプロセスで 1 つのサーフェス内の複数の四角形を同時にロックできます。 マルチサンプル バック バッファーはロックできないことに注意してください。

IDirect3DSurface9::LockRect メソッドは、サーフェス メモリに適切にアクセスするために、すべての情報をD3DLOCKED_RECT構造体に入力します。 構造体にはピッチに関する情報が含まれており、ロックされたビットへのポインターがあります。 サーフェス メモリへのアクセスが完了したら、 IDirect3DSurface9::UnlockRect メソッドを呼び出してロックを解除します。

サーフェスがロックされている間は、コンテンツを直接操作できます。 次の一覧では、サーフェス メモリを直接レンダリングする際の一般的な問題を回避するためのヒントについて説明します。

  • 一定の表示ピッチを想定しないでください。 IDirect3DSurface9::LockRect メソッドによって返されるピッチ情報を常に調べます。 このピッチは、サーフェス メモリの場所、ディスプレイのカードの種類、Direct3D ドライバーのバージョンなど、さまざまな理由で異なる場合があります。 詳細については、「 幅とピッチ (Direct3D 9)」を参照してください。
  • ロックされていないサーフェスにコピーすることを確認します。 ロックされたサーフェスで呼び出されると、Direct3D コピー メソッドは失敗します。
  • サーフェスがロックされている間にアプリケーションのアクティビティを制限します。
  • 常にデータをコピーしてメモリを表示します。 Windows 98 では、ページ フォールト ハンドラー Vflatd.386 を使用して、銀行切り替えメモリを備えたディスプレイ カード用の仮想フラット フレーム バッファーを実装します。 ハンドラーを使用すると、これらのディスプレイ デバイスで Direct3D に線形フレーム バッファーを表示できます。 メモリを表示するためにデータをアラインされていない状態でコピーすると、コピーがメモリ バンクにまたがる場合にシステムが操作を中断する可能性があります。
  • 動的テクスチャまたは IDirect3DDevice9::CreateOffscreenPlainSurface を使用して作成されたサーフェスでない限り、D3DPOOL_DEFAULT メモリ プールに割り当てられたリソースに属している場合、サーフェスはロックされません。 IDirect3DDevice9::GetBackBuffer メソッドと IDirect3DSwapChain9::GetBackBuffer メソッドを使用してアクセスできるバック バッファー サーフェスは、D3DPRESENT_PARAMETERSの Flags メンバーを使用してスワップ チェーンが作成され、D3DPRESENTFLAG_LOCKABLE_BACKBUFFERを含める場合にのみロックできます。

Direct3D サーフェス