2010-11-19 25 views
0

Je travaille sur un projet personnel qui crée une image unique à partir d'une grille d'images. Il faut un certain temps pour générer l'image et ne rafraîchit pas chaque fois que le code est exécuté. Comment peut-on rendre l'interface encore fonctionnelle (non verrouillée) lors de la génération de l'image. Donc, pour commencer: J'ai une grille d'identifiants N x N, basée sur l'identifiant que je dessine une image spécifique en (x, y) avec une hauteur et une largeur données.Génération d'image WPF à l'aide d'une grille d'images N x N

Cette image est régénérée à chaque itération et doit être mise à jour sur le WPF. Il est également lié à ImageSource de l'image du côté xaml

Mon problème est «Comment améliorer les performances de génération de cette grande image» et «Comment actualiser l'image autant de fois que nécessaire (par génération).

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

Recherchez quelque chose comme l'exemple BackgroundWorker WPF. Par exemple. celui-ci - http://www.tanguay.info/web/index.php?pg=codeExamples&id=232 –

Répondre

0

Il existe deux façons. En premier lieu et le plus bénéfique serait d'améliorer les performances perçues, faites cela en générant l'image sur un thread de travail et utilisez des événements pour mettre à jour l'image sur le thread UI aux points clés afin que vos utilisateurs puissent voir la progression.

Pour améliorer les performances réelles, si vous ciblez et utilisez des systèmes multicœurs, vous pouvez essayer des fonctions parallèles si vos itérations peuvent réellement être effectuées en parallèle. Cela demandera du travail et un état d'esprit différent, mais cela vous aidera si vous faites l'effort. Je vous recommande d'étudier PLINQ pour commencer.