アプリを再開すると、画像が失われることがあります。些細なアプリでもこれを再現できます。
これは、画像がどこから来たかに応じて、2 つの異なる方法で現れます。
<Image Source="/Assets/Logo.png"/>
たとえば、アプリ パッケージから URI で画像を読み込むなどの操作を行った場合、画像は一時的に消えてから再読み込みされます。これは、画面に多くの画像が含まれている場合に見やすくなります。それらは順番にリロードされるため、画像のロードが画面全体に波及するのを見ることができます。- を作成し
WriteableBitmap
て Image.Source にバインドすると、ビットマップは完全に消え、元に戻りません。
画像をリロードするだけなら、おそらくこれで問題ありませんが (波及効果は不快ですが)、かなりの量の動的画像生成を行っており、すべての WriteableBitmaps が消えるのはクールではありません。
これは、アプリが一時停止して再開するたびに発生するわけではなく、ときどき発生します。信頼できる再現ケースを突き止めたわけではありませんが、中断が長引くほど、その間に他のことをしているようです (デスクトップ Chrome で Web をサーフィンする、TapTiles や Microsoft Minesweeper などのフルスクリーン DirectX ゲームをプレイする)。 、アプリに戻ると画像が失われる可能性が高くなります。(アプリは終了して再起動されません。同じアプリ インスタンスのままです。)
ビデオメモリから画像がフラッシュされるのと関係があるのだろうか。しかし、この仮説を検証する方法がわからないので、現時点では推測にすぎません。
これまでのところ、自分のプログラムが WriteableBitmaps が失われていることを通知する方法すら見つけていません。イベントのシーケンスは、通常の中断と再開と同じです。
- Window.Current.Activated は args.WindowActivationState == Deactivated で起動します
- Window.Current.VisibilityChanged は args.Visible == false で起動します
- Application.Suspending fires
- (時を経て)
- Application.Resuming fires
- Window.Current.VisibilityChanged は args.Visible == true で起動します
- Window.Current.Activated は args.WindowActivationState == CodeActivated で起動します
「ちなみに、あなたの画像はすべて消えてしまいました」というイベントを見つけられませんでした。WriteableBitmapにはイベントがありません。Imageには ImageOpened イベントと ImageFailed イベントがありますが、それらは URI からイメージをロードしたときにのみ発生します。Source が WriteableBitmap の場合は決して発生しません。
これは簡単なアプリで再現できたので、サードパーティのライブラリが原因ではありません。URI によって読み込まれた画像を含む空白のページは、アプリがしばらく中断されてから再開された場合、ImageOpened を再度起動します (画像はリロードが完了する前に少しちらつきます)。アプリがしばらく中断されてから再開すると、WriteableBitmap に初期化された画像を含む空白のページが消えます。
WriteableBitmaps (および、可能であれば content-URI 画像も) の損失を修正するにはどうすればよいですか? そもそも画像が失われないようにする方法はありますか? そうでない場合、それらが失われたことを検出して、WriteableBitmaps を再作成できる方法はありますか?
(おまけとして、画像が消える理由を知りたいのですが、その部分は完全にオプションです。WinRT が理にかなっているという期待はずっと前から諦めていました。)