2010-11-19 5 views
0

나는 이미지 격자에서 하나의 이미지를 만드는 개인 프로젝트를 작업 중입니다. 이미지를 생성하는 데 시간이 걸리고 코드가 실행 된 후에 만 ​​매번 새로 고치지 않습니다. 어떻게 이미지를 생성 할 때 인터페이스가 여전히 작동하도록 (잠기지 않고) 만들 수 있습니까?Nx 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 예제와 같은 것을 검색하십시오. 예 : 이 하나 - http://www.tanguay.info/web/index.php?pg=codeExamples&id=232 –

답변

0

두 가지가 있습니다. 가장 먼저 유익한 것은 인식 된 성능을 향상시키는 것입니다. 작업자 스레드에서 이미지를 생성하고 이벤트를 사용하여 키 포인트에서 UI 스레드의 이미지를 업데이트하면 사용자가 진행 상황을 볼 수 있습니다.

실제 성능을 향상 시키려면 멀티 코어 시스템을 대상으로하고 사용하는 경우 반복을 실제로 병렬로 수행 할 수 있다면 병렬 기능을 사용해보십시오. 이것은 약간의 일과 다른 사고 방식을 필요로하지만, 노력을 기울이면 도움이 될 것입니다. 시작하려면 PLINQ를 공부하는 것이 좋습니다.