2010-11-19 21 views
0

私は、画像のグリッドから単一の画像を作成するパーソナルプロジェクトに取り組んでいます。イメージの生成にはしばらく時間がかかり、コードの実行が完了するたびにリフレッシュされません。イメージを生成するときに、どのようにしてインタフェースを機能させることができますか(ロックされていない)。画像のN x Nグリッドを使用したWPF画像の生成

開始するには: 識別子のN x Nグリッドがあり、識別子に基づいて、(x、y)に特定の縮尺の高さと幅で特定のイメージを描画します。

このイメージは各繰り返しが再生成され、WPFで更新する必要があります。また、xaml側の画像の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)); 
     } 
    } 
    } 
} 
+0

BackgroundWorker WPFのようなものを検索します。例えば。この1つ - http://www.tanguay.info/web/index.php?pg=codeExamples&id=232 –

答えて

0

2つの方法があります。最初に最も効果的なのは、認識されたパフォーマンスを向上させることです。ワーカースレッドでイメージを生成し、イベントを使用してキーポイントでUIスレッドのイメージを更新し、ユーザーに進捗状況を確認させることで実現します。

実際のパフォーマンスを向上させるには、マルチコアシステムをターゲットにして使用している場合、実際に並列処理を行うことができれば並列機能を試すことができます。これはいくつかの仕事と別の考え方を必要としますが、努力をすると助けになります。私はPLINQを勉強して始めてみることをお勧めします。

関連する問題