サーフェイス メモリへの直接アクセス
サーフェイス メモリへの直接アクセス
サーフェイス メモリに直接アクセスするには、IDirect3DSurface9::LockRect メソッドを使う。このメソッドを呼び出す場合、pRect パラメータは、直接アクセスしようとするサーフェイス上の矩形を記述する RECT 構造体へのポインタとする。サーフェイス全体をロックするには、pRect を NULL に設定する。また、サーフェイスの一部だけをカバーする RECT を指定することもできる。2 つの矩形が重ならなければ、2 つのスレッドまたは 2 つのプロセスは、サーフェイスの複数の矩形を同時にロックすることができる。マルチサンプル バック バッファはロックできないことに注意すること。
IDirect3DSurface9::LockRect メソッドは、サーフェイス メモリに正しくアクセスするために必要となるすべての情報を、D3DLOCKED_RECT 構造体に格納する。この構造体には、ピッチに関する情報が含まれており、ロックされているビットへのポインタがある。サーフェイス メモリへのアクセスが終了すると、IDirect3DSurface9::UnlockRect メソッドを呼び出して、ロックを解除する。
サーフェイスをロックしている間、そのコンテンツを直接操作できる。サーフェイス メモリを直接レンダリングするときの一般的な問題を避けるためのヒントを、以下のリストで示す。
- 一定のディスプレイ ピッチを仮定しない。常に、IDirect3DSurface9::LockRect メソッドが返すピッチ情報を調べること。このピッチは、サーフェイス メモリの位置、ディスプレイ カードのタイプ、Microsoft® Direct3D® ドライバのバージョンなど、さまざまな理由によって変化する。詳細については、「幅とピッチ」を参照すること。
- コピーするときは、コピー先のサーフェイスのロックが解除されていることを確認すること。ロックされているサーフェイスに対して Direct3D のコピー メソッドを呼び出すと失敗する。
- サーフェイスがロックされている間、アプリケーションの動作は制限される。
- 必ず、ディスプレイ メモリに対して連続するデータをコピーすること。Microsoft Windows® 98 では、ページ フォールト ハンドラ Vflatd.386 を使って、バンクスイッチ メモリを使ったディスプレイ カードに対する仮想フラットフレーム バッファを実装する。このハンドラにより、これらのディスプレイ デバイスは Direct3D に連続したフレーム バッファを渡すことができる。ディスプレイ メモリに対して不連続のデータをコピーすると、コピーがメモリ バンクにスパンする場合に、システムが一時停止を起こす可能性がある。
- 動的テクスチャおよび IDirect3DDevice9::CreateOffscreenPlainSurface を使って作成されたサーフェイスを除き、D3DPOOL_DEFAULT メモリ プールに割り当てられたリソースに属するサーフェイスは、ロックできない場合がある。バック バッファ サーフェイス (IDirect3DDevice9::GetBackBuffer および IDirect3DSwapChain9::GetBackBuffer メソッドを使ってアクセスできる) をロックできるのは、スワップ チェーンが D3DPRESENTFLAG_LOCKABLE_BACKBUFFER を含めるように D3DPRESENT_PARAMETERS 構造体の Flags メンバを使って作成されている場合だけである。