4

アプリを再開すると、画像が失われることがあります。些細なアプリでもこれを再現できます。

これは、画像がどこから来たかに応じて、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 が理にかなっているという期待はずっと前から諦めていました。)

4

2 に答える 2

2

私は、WinRT が WriteableBitmap 自体ではなく、WriteableBitmap の内容を失っているだけであることを明らかにするいくつかの実験を行いました。WriteableBitmap インスタンスはまだ実行可能です。新しいピクセル データを指定すると、正常に動作します。アプリの再開時に、そのコンテンツが透明なピクセルの帯に置き換えられることがあります。

アプリの OnResuming イベントをフックし、そのイベントを使用して WriteableBitmap の PixelBuffer.AsStream() を取得し、新しいピクセルを書き込み、WriteableBitmap.Invalidate() を呼び出すことで、この問題を回避できました。画像を再生成するコードが同期的である場合、アプリが再開しても画像がちらつきません。

通常のビットマップ (ソース URI 経由で読み込まれる) もピクセル バッファーを失い、アプリの再開後にピクセルをリロードする必要があるのではないかと思います。画像の読み込みは非同期であるため、コンテンツが再表示される前に遅延/ちらつきが発生します。

画像がピクセルを失ったかどうかを知る方法は見つかりませんでした (ただし、URI で読み込まれた画像は自動的に再読み込みされるため、何らかの方法で知ることができます)。そのため、WriteableBitmaps を使用する場合、最も安全なのは、アプリの再開時に常にそれらを再設定することです。

于 2013-02-10T01:44:58.583 に答える