サーフェス メモリーへの直接的なアクセス (Direct3D 9)
IDirect3DSurface9::LockRect メソッドを使用すると、サーフェス メモリーに直接アクセスできます。このメソッドを呼び出す場合、pRect パラメーターは、直接アクセスするサーフェス上の矩形を記述する RECT 構造体へのポインターです。サーフェス全体がロックされるように要求するには、pRect を NULL に設定します。また、サーフェスの一部だけをカバーする RECT を指定することもできます。2 つの矩形が重なり合っていなければ、2 つのスレッドまたはプロセスは、サーフェス上の複数の矩形を同時にロックできます。マルチサンプル バック バッファーはロックできないので注意してください。
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 を含むように作成された場合のみロックできます。