"デバイスの紛失" とは、GPU グラフィックス デバイスがそれ以上レンダリングで使用できなくなる状況を指します。 これは、GPU ハードウェアの誤動作、ドライバーのバグ、ドライバー ソフトウェアの更新、またはアプリの GPU 間の切り替えによって発生する可能性があります。 紛失したデバイスはもう使用できず、Win2D からこれを試みると例外がスローされます。 この状況から復旧するには、アプリで新しいデバイスを作成し、そのすべてのグラフィックス リソースを再作成する必要があります。
すべてのアプリが紛失したデバイスから回復しようとしているわけではありません。 これはできればまれな状況で、発生した場合、一部の開発者はアプリをクラッシュさせてしまいます。 堅牢な方法で紛失したデバイスを処理する方のために、この記事ではその方法について説明します。
XAML コントロールを使用しているときにデバイスが失われた
Win2D コントロール (CanvasControl、 CanvasVirtualControl 、 CanvasAnimatedControl) は、アプリの代わりに紛失したデバイスを自動的に処理しようとします。
デバイスの紛失が検出されると、これらのコントロールはCanvasDeviceを再作成し、その後、CreateResourcesのCanvasCreateResourcesReasonを渡すNewDeviceイベントを発生させます。 アプリは、新しいデバイスを使用してすべてのグラフィックス リソースを再作成し、古い有効なリソースへの参照を含む可能性があるデータ構造を更新することで、このイベントに応答する必要があります。
コントロールは、CreateResources、Update、Draw、または RegionsInvalidated イベントハンドラーによってスローされるデバイスロスト例外を自動的にキャッチして処理できます。 他の場所 (ポインターやキーボード入力イベント ハンドラーなど) から Win2D 描画 API を呼び出す場合は、次のセクションを参照してください。
紛失したデバイスを手動で処理する
組み込みのコントロール を使用せずに、または IsDeviceLost(Int32) メソッドと RaiseDeviceLost() メソッドを使用します。
try
{
DrawStuff();
}
catch (Exception e) where canvasDevice.IsDeviceLost(e.ErrorCode)
{
canvasDevice.RaiseDeviceLost();
}
RaiseDeviceLostを呼び出すと、このデバイスを共有しているコントロールは、紛失したデバイスの回復パスを開始するように指示されます。 コントロール以外の場所からデバイスを取得した場合は、 DeviceLost イベントを使用して、紛失したときに通知を受け取ります。
デバイスの紛失処理をテストする方法
デバイスの紛失に対応してアプリが正しいことを行うことをテストする最も簡単な方法は、アプリの実行中にハードウェア GPU を無効にすることです。
- デバイス マネージャーを開く ([エクスプローラー] ウィンドウ> [この PC] -> [プロパティ] -> [デバイス マネージャー] を右クリックします)
- [ディスプレイ アダプター] ノードを展開します
- GPU のエントリを右クリックし、[無効] をクリックします。これにより、ハードウェア GPU がバイパスされ、Windows が WARP ソフトウェア レンダリング デバイスに切り替わり、すべてのアクティブなアプリでデバイスが失われます。
このテストを実行した後、GPU を再び有効化することを忘れないでください。 デバイスの紛失を複数回テストする場合は、毎回アプリを再起動することをお勧めします (常に GPU を有効にして起動します)。 アプリの実行中に GPU のオンとオフを繰り返し切り替える場合、WARP ソフトウェア デバイスの使用を継続する可能性があるため、デバイスが失われることはありません。
デバイス紛失処理のテストを行う際には、動的なディスプレイ DPI の変更にアプリが正しく対応していることをおそらく確認したいでしょう。
Windows developer