次の方法で共有


4. デバイスの消失

4. デバイスの消失

Microsoft® Direct3D® デバイスの状態には、処理可能状態と消失状態がある。処理可能状態はデバイスの通常の状態であり、すべてのレンダリングが予測どおりに実行され表示される。フルスクリーン アプリケーションでキーボード フォーカスが消失するなどのイベントが発生してレンダリングできなくなると、デバイスは消失状態になる。消失状態の特性は、表面的には何も現れずにすべてのレンダリング処理が失敗することである。つまり、レンダリング処理は失敗しているのに、レンダリング メソッドは成功コードを返すことがある。このような状況で、Device.DeviceLost イベントがトリガされる。

設計では、デバイスが消失するようなすべてのシナリオが想定されているわけではない。一般的な例としては、ユーザーが Alt + Tab キーを押したときなど、つまりシステム ダイアログが初期化されたときにフォーカスが消失する。また、電力管理イベントによって、または他のアプリケーションがフルスクリーン処理を行うときにもデバイスが消失することがある。さらに、Device.Reset が失敗すると、デバイスは消失状態となる。

次の 2 つの例外オブジェクトが処理されることがある。

  • DeviceLostException: このオブジェクトは、デバイスが消失しているがリセットできないため、レンダリングができないことを示す。
  • DeviceNotResetException: このオブジェクトは、デバイスが消失しているがその時点でリセットできることを示す。

デバイス消失への応答

消失したデバイスは、リセット後にリソース (ビデオ メモリ リソースを含む) を再作成する必要がある。デバイスが消失すると、アプリケーションはそのデバイスに対して、処理可能状態に復元できるかどうかを問い合わせる。復元できない場合は、デバイスが復元できるまでアプリケーションは待機する。

復元できる場合、アプリケーションはすべてのビデオ メモリ リソースとスワップ チェーンを破棄して、デバイスの復元に備える。次に、アプリケーションは Reset メソッドを呼び出す。Reset はデバイスが消失したときに唯一機能するメソッドであり、アプリケーションで使い、デバイスを消失状態から処理可能状態に変更できる唯一のメソッドである。CreateRenderTarget メソッドおよび CreateDepthStencilSurface メソッドで作成したリソースを含め、アプリケーションが Default に割り当てたすべてのリソースを解放しない限り、このメソッドの呼び出しは失敗する。

ほとんどの場合、Direct3D の頻繁に呼び出してもデバイスが消失したかどうかについての情報を返さない。アプリケーションは、デバイスの消失の通知を受けずに、Device.DrawPrimitives などのレンダリング メソッドの呼び出しを続けることがある。内部的には、デバイスが処理可能状態に戻るまで、これらの処理は無視される。

アプリケーションは CheckCooperativeLevel メソッドの戻り値を確認することで、デバイスが消失しているかどうかを確認できる。

ロック処理

Direct3D では、デバイスが消失した後にロックが正しく処理されるよう内部的に十分な作業を行っている。しかし、ビデオ メモリ リソースのデータがロック処理中に正しい保証はない。エラー コードが返らないことは保証されている。そのため、ロック処理中のデバイスの消失を考慮せずにアプリケーションを作成できる。

リソース

リソースはビデオ メモリを消費することがある。デバイスの消失は、アダプタが所有するビデオ メモリから切断されるため、デバイスが消失したときにビデオ メモリの割り当てを保証することはできない。その結果、すべてのリソース作成メソッドはダミー システム メモリしか割り当てない。デバイスのサイズ変更前にビデオ メモリ リソースは破棄しなければならないため、ビデオ メモリの割り当て超過の問題は発生しない。このようなダミー サーフェイスにより、アプリケーションが Device.Present を呼び出し、デバイスが消失したことを検出するまで、ロック処理とコピー処理は正しく機能しているように見える。

すべてのビデオ メモリを解放しないと、デバイスを消失状態から処理可能状態にリセットすることはできない。つまり、アプリケーションは SwapChain を使って作成したスワップ チェーン、および Pool.Default メモリに格納されたリソースを解放する必要がある。アプリケーションは Managed メモリまたは SystemMemory メモリのリソースを解放する必要はない。処理可能状態に移行することで、他の状態データは自動的に破棄される。

単一のコード パスを使ってデバイスの消失に応答するアプリケーションを開発することを推奨する。このコード パスは、起動時にデバイスの初期化に使うコード パスと同一ではないにしても、似ていることが多い。

データの取得

アプリケーションは、Direct3D の ValidateDevice を使い、ハードウェアによるシングルパス レンダリングに対するテクスチャ ステートとレンダリング ステートの妥当性を確認できる。通常、このメソッドを、アプリケーションの初期化時に呼び出すこと。デバイスが消失している場合、このメソッドは DeviceLostException オブジェクトを返す。

また、Direct3D でアプリケーションは、ビデオ メモリ リソースから不揮発性のシステム メモリ リソースに、生成されたか以前書き込まれたイメージをコピーできる。そのようにソース イメージは転送中にいつでも消失する可能性があるため、デバイスが消失した時は、そのようなコピー処理の失敗が許可されている。

UpdateSurfaceGetFrontBufferData を使ったコピー処理は、コピー元オブジェクトが揮発性メモリ (Pool.Default) にあり、コピー先オブジェクトが不揮発性メモリ (SystemMemory または Managed) にあるとき、DeviceLostException オブジェクトを返すことがある。GetFrontBufferData 呼び出しは、プライマリ サーフェイスからのデータの取得に失敗することがある。PresentTestCooperativeLevelReset の各メソッド以外で DeviceLostException を返すのはこの場合だけである点に注意すること。

プログラマブル シェーダ

Microsoft DirectX® 9.0 では、Device.Reset を呼び出した後で、Vertex Shader 1_1 および Pixel Shader 1_X を再作成する必要はない。これらは記憶されている。DirectX の以前のバージョンでは、デバイスが消失すると、シェーダを再作成する必要があった。

© 2002 Microsoft Corporation. All rights reserved. Terms of use.