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