2010-11-19 14 views
0

Ich arbeite an einem persönlichen Projekt, das ein einzelnes Bild aus einem Raster von Bildern erstellt. Es dauert eine Weile, um das Bild zu erzeugen, und es wird nicht jedes Mal aktualisiert, wenn der Code erst ausgeführt wird. Wie kann die Schnittstelle beim Erzeugen des Bildes noch funktionsfähig (nicht gesperrt) werden?WPF-Bildgenerierung mit einem N × N Raster von Bildern

So starten: Ich habe ein N x N Raster von Bezeichnern, basierend auf der Kennung zeichne ich ein bestimmtes Bild bei (x, y) mit einer gegebenen skalierten Höhe und Breite.

Dieses Bild wird bei jeder Iteration neu generiert und muss auf dem WPF aktualisiert werden. Es ist auch an die ImageSource des Bildes auf der XAML-Seite

gebunden Mein Problem ist "Wie verbessere ich die Leistung der Generierung dieses großen Bildes" und "Wie aktualisiere ich das Bild so oft wie ich muss (per Generation).

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

Suche nach etwas wie BackgroundWorker WPF Beispiel. Z.B. dieser - http://www.tanguay.info/web/index.php?pg=codeExamples&id=232 –

Antwort

0

Es gibt zwei Möglichkeiten. Am besten und erstens wäre es, die wahrgenommene Leistung zu verbessern, indem Sie das Bild in einem Worker-Thread generieren und Ereignisse verwenden, um das Bild im UI-Thread an wichtigen Punkten zu aktualisieren, damit Ihre Benutzer den Fortschritt sehen können.

Um die tatsächliche Leistung zu verbessern, können Sie bei der Ausrichtung und Verwendung von Multicore-Systemen parallele Funktionen ausprobieren, wenn Ihre Iterationen tatsächlich parallel ausgeführt werden können. Dies erfordert etwas Arbeit und eine andere Denkweise, wird aber helfen, wenn Sie sich anstrengen. Ich würde empfehlen, PLINQ zu studieren, um loszulegen.