イメージがうまくいかない理由を理解しようとしています。そのため、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();
私は知恵の終わりです。画像は目立つ遅延で現れ、それは私のコントロールから外れているようです。私に何ができる?
答えていただきありがとうございます。はい、私は同時にそのすべての画像を見たいと思います。テストのための1600,2500,3600のケースがありましたので、WPFの遅延を時計の秒針で簡単に測定できましたが、私がサポートしたいと思う400のイメージがあります。 そして、 "より良いデコーダ"の輻輳を解消するために、上記の "smallerBitmapImage"コードで既にデコードが行われていると思っていました。私のコードでは、WPFはイベントハンドラが復帰した後短縮することを試みています... – Avi
@Avi:ああ、ファイルはおそらくローカルであるため、デコードは同期的に起こるかもしれませんが、内部についてはわかりません。その変換は、仮定が実行可能であるように見える例外をスローしないことを考えると、これが純粋なレンダリング時間になる場合は、すでにデコードからスケーリングを防ぐために、デコードからスピードアップできるすべてのことをやっているように、実際にバインドされている可能性があります。あなたがここで何ができるかわからない:( –