Platform SDK: DirectX

ステート ブロックの記録

[C++]

IDirect3DDevice7 インターフェイスには、アプリケーションからデバイス ステートの要求があったときにそのデバイス ステートをステート ブロックに記録する IDirect3DDevice7::BeginStateBlock メソッドがある。BeginStateBlock メソッドは、デバイス ステートの変更をデバイスに適用するのではなく、デバイス ステートの変更をステート ブロックに記録し始める。BeginStateBlock を呼び出した後、以下のあらゆるメソッドの呼び出しがデバイス ステート ブロックに記録される。

ステート ブロックの記録が終了したら、IDirect3DDevice7::EndStateBlock メソッドを呼び出して記録の停止をシステムに知らせる。EndStateBlock メソッドは、記録したステート ブロックのハンドルを変数に格納する。この変数のアドレスは lpdwBlockHandle パラメータに渡す。アプリケーションでは、このハンドルを使用して、必要に応じてステート ブロックをデバイスに適用したり、新しいステート データをブロックに記録したり、不要になったステート ブロックを削除することができる。

[Visual Basic]

Direct3DDevice7 オブジェクトには、アプリケーションからデバイス ステートの要求があったときにそのデバイス ステートをステート ブロックに記録する Direct3DDevice7.BeginStateBlock メソッドがある。BeginStateBlock メソッドは、デバイス ステートの変更をデバイスに適用するのではなく、デバイス ステートの変更をステート ブロックに記録し始める。BeginStateBlock を呼び出した後、以下のあらゆるメソッドの呼び出しがデバイス ステート ブロックに記録される。

ステート ブロックの記録が終了したら、Direct3DDevice7.EndStateBlock メソッドを呼び出して記録の停止をシステムに知らせる。EndStateBlock メソッドは、記録したステート ブロックのハンドルを、blockHandle パラメータに渡す変数に格納する。アプリケーションでは、このハンドルを使用して、必要に応じてステート ブロックをデバイスに適用したり、新しいステート データをブロックに記録したり、不要になったステート ブロックを削除することができる。

パフォーマンスに関する注意 :  最良の結果を得るためには、BeginStateBlock/EndStateBlock のペア間でのすべてのステート変更をグループ化する。

EndStateBlock メソッドが返すエラー コードをチェックすることが大切である。このメソッドが失敗した場合、その原因の多くはディスプレイ モードが変更されたことであると考えられる (エラー コード DDERR_SURFACELOST)。アプリケーションのサーフェスを作成し直し、再度ステート ブロックを記録することで、このような障害からアプリケーションが回復するように設計する。