2012-02-13 9 views
8

イメージがうまくいかない理由を理解しようとしています。そのため、WPFのパフォーマンスをテストするサンプルを作成しました。私は、私の "表示イメージ"イベントハンドラが実行された時間を計算するためにタイマーを使用し、ストップウォッチを使ってイメージが画面に表示されるまでの時間を測定しました。結論:100,1600,2500,3600の画像を表示するとき、WPFは2、9、12、16秒で表示されました。の画像が画面に表示されたあと、が終了しました。だから私は無力感を感じる:画像をより速く見せるためにコードを改善できないようだ - 私はWPFで何かする必要がある!WPFビットマップのパフォーマンス

私の質問はです。イメージをより速く表示するには、どうすればよいですか?


テスト・セットアップは簡単です:

ウィンドウには、グリッドが含まれています。 「テスト」ボタンがクリックされた後、行と列の定義がadded.Thenされ、以下のように画像は、グリッドの各セルに添加する:

最後に、各画像のソースはビットマップに設定されている
  var image = new Image(); 
      image.BeginInit(); 
      image.Name = ImageNameFromCell(theRow, theColumn); 
      image.Stretch = Stretch.None; 
      image.HorizontalAlignment = HorizontalAlignment.Center; 
      image.VerticalAlignment = VerticalAlignment.Center; 
      RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); 
      image.EndInit(); 

      theGrid.Children.Add(image); 

。推定されたスクリーンサイズに既に縮小されたグレースケール画像を生成する。ビットマップは次のように生成されます:

  var smallerBitmapImage = new BitmapImage(); 
      smallerBitmapImage.BeginInit(); 
      smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth); 
      smallerBitmapImage.UriSource = theUri; 
      smallerBitmapImage.CacheOption = BitmapCacheOption.None; 
      smallerBitmapImage.EndInit(); 

      //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath); 

      var convertedBitmap = new FormatConvertedBitmap(); 
      convertedBitmap.BeginInit(); 
      convertedBitmap.Source = smallerBitmapImage; 
      convertedBitmap.DestinationFormat = PixelFormats.Gray16; 
      convertedBitmap.EndInit(); 
      convertedBitmap.Freeze(); 

私は知恵の終わりです。画像は目立つ遅延で現れ、それは私のコントロールから外れているようです。私に何ができる?

答えて

3

smallerBitmapImage.CacheOption = BitmapCacheOption.OnLoad。

これは、私のイベントハンドラに作業を移しました。そこで、これをバックグラウンドで行うためにプリフェッチを使用できます。

3

あなたは実際にそれらのすべての画像を同時に見ますか?そうでない場合は、仮想化パネルでItemsControlを使用することができますので、表示されている画像のみが表示されます。

あなたはまた、おそらく無駄な努力でより良いデコーダを、書くために試みることができる(パネルといえば、あなたの現在の設定もUniformGridpanelとして使用していますItemsControlと置き換えることができます)。 onLoadの画像のキャッシュオプションを設定している違い作られたように見える何

+0

答えていただきありがとうございます。はい、私は同時にそのすべての画像を見たいと思います。テストのための1600,2500,3600のケースがありましたので、WPFの遅延を時計の秒針で簡単に測定できましたが、私がサポートしたいと思う400のイメージがあります。 そして、 "より良いデコーダ"の輻輳を解消するために、上記の "smallerBitmapImage"コードで既にデコードが行われていると思っていました。私のコードでは、WPFはイベントハンドラが復帰した後短縮することを試みています... – Avi

+1

@Avi:ああ、ファイルはおそらくローカルであるため、デコードは同期的に起こるかもしれませんが、内部についてはわかりません。その変換は、仮定が実行可能であるように見える例外をスローしないことを考えると、これが純粋なレンダリング時間になる場合は、すでにデコードからスケーリングを防ぐために、デコードからスピードアップできるすべてのことをやっているように、実際にバインドされている可能性があります。あなたがここで何ができるかわからない:( –

関連する問題