0

私は、画像のグリッドから単一の画像を作成する個人的なプロジェクトに取り組んでいます。画像の生成には時間がかかり、コードの実行が完了すると毎回更新されません。イメージを生成するときに、インターフェイスを引き続き機能させる (ロックアップしない) にはどうすればよいですか。

開始するには: 識別子の N x N グリッドがあり、識別子に基づいて、特定のスケーリングされた高さと幅で (x,y) に特定の画像を描画します。

このイメージは反復ごとに再生成され、WPF で更新する必要があります。また、xaml 側の Image の ImageSource にバインドされます

私の問題は、「この大きな画像を生成するパフォーマンスを向上させるにはどうすればよいですか」と「(世代ごとに) 必要な回数だけ画像を更新するにはどうすればよいですか」です。

for (int i = 0; i < numberOfIterations; i++)
{
  // Do Some Work
  UpdateImage();
}
...
BitmapImage imgFlower = new BitmapImage(new Uri(@"Images\Flower.bmp", UriKind.Relative));
BitmapImage imgPuppy = new BitmapImage(new Uri(@"Images\Puppy.bmp", UriKind.Relative));
ImageSource GeneratedImage{ get{ GenerateImage(); } set; } 
...
void UpdateImage() { OnPropertyChanged("GeneratedImage"); }
...
ImageSource GenerateImage()
{
  RenderTargetBitmap bmp = new RenderTargetBitmap(223, 223, 96, 96, PixelFormats.Pbgra32);
  DrawingVisual drawingVisual = new DrawingVisual();
  using (DrawingContext drawingContext = drawingVisual.RenderOpen())
  {
    double scaleRatio = CalculateScaleRatio();
    DrawGridOfImages(drawingContext, scaleRatio);
  }
  bmp.Render(drawingVisual);
  return bmp;
}
...
DrawGridOfImages(...)
{
  double x,y;
  for (int r = 0; r < NumberOfRows; r++)
  {
    x = r * scaleRatio;
    for (int c = 0; c < NumberOfColumns; c++)
    {
      y = c * scaleRatio;
      switch (imageOccupancy[r, c])
      {
         case Flower: drawingContext.DrawImage(imgFlower, new Rect(x,y,scaleRatio,scaleRation));
         case Puppy: drawingContext.DrawImage(imgPuppy, new Rect(x,y,scaleRatio,scaleRatio));
      }
    }
  }
}
4

1 に答える 1

0

2つの方法があります。最初に最も有益なのは、知覚されるパフォーマンスを改善することです。これを行うには、ワーカースレッドで画像を生成し、イベントを使用してUIスレッドの重要なポイントで画像を更新し、ユーザーが進行状況を確認できるようにします。

実際のパフォーマンスを向上させるために、マルチコアシステムをターゲットにして使用している場合、反復を実際に並列で実行できるのであれば、並列関数を試すことができます。これには、いくらかの作業と異なる考え方が必要になりますが、努力を注ぐと役立ちます。開始するには、PLINQを勉強することをお勧めします。

于 2010-11-19T21:45:40.290 に答える