Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。
ハードウェア転送では、アプリケーションでよく使う仮想アドレスではなく物理メモリ アドレスを使う。デバイス ドライバによっては、サーフェスの物理メモリ アドレスを要求することがある。この機構は、IDirectDrawSurface7::PageLock メソッドで実現される。デバイス ドライバがページ ロックを要求しない場合、IDirectDraw7::GetCaps メソッドを呼び出してハードウェア能力を取得するときに DDCAPS2_NOPAGELOCKREQUIRED フラグが設定される。
サーフェスをページ ロックすることで、システムがサーフェスの物理メモリが他の目的で使用されることを阻止できる。また、サーフェスの物理アドレスが、対応する IDirectDrawSurface7::PageUnlock が呼び出されるまで一定に維持されることも保証される。デバイス ドライバがページ ロックを要求する場合、DirectDraw では、アプリケーションがページ ロックしているシステム メモリ サーフェス上だけで非同期の DMA 処理を認める。このような状況で、IDirectDrawSurface7::PageLock を呼び出さない場合、DirectDraw はソフトウェア エミュレーションを使って転送を行う。大容量のシステム メモリをロックすると、Windows の動作が遅くなることに注意する。したがって、フルスクリーンの排他モード アプリケーションだけで、大容量のシステム メモリに対する IDirectDrawSurface7::PageLock を使い、このようなアプリケーションが最小化された場合に、そのサーフェスのロックを解除することを心掛けることが強く望まれる。もちろん、アプリケーションがリストアされると、システム メモリ サーフェスを再びページ ロックしなければならない。
ページ ロックの管理は、そのすべてをアプリケーション開発者の責任で行う。DirectDraw では、サーフェスをページ ロックしたりページ ロックを解除したりすることはない。つまり、開発者自身が、システム パフォーマンスを低下させることなく、どの程度のメモリを安全にページ ロックできるかを決定しなくてはならない。