2012-02-28 3 views
2

내 코드의 성능에 문제가 있습니다 ... 많은 색의 사각형을 내 DrawingVisual로 렌더링해야합니다.많은 요소를 DrawingVisual로 렌더링

using (DrawingContext dc = Canvas.RenderOpen()) 
{ 
    for (Int32 x = 0; x < widthCount; x++) 
     for (Int32 y = 0; y < heightCount; y++) 
     { 
      Color c; 
      Double value = mass[x, y]; 
      c = GetColorByValue(value); 
      dc.DrawRectangle(new SolidColorBrush(c), null, 
      new Rect(x * step - step/2, y * step - step/2, step, step)); 
     } 
} 

를 그리고 약 250x250 크기 인 직사각형의 양의 경우 정상 작동 (그리고 200MB가 RAM을 얻는다) :

첫 번째 버전은 간단하다. 그러나 그 수가 750x750이면 렌더링 과정이 너무 길고 느립니다 (2.5Gb RAM 이상을 얻음)

다음 단계는 버퍼와 같은 비트 맵을 사용하고 있습니다. 그러나 DrawingVisual의 크기에는 문제가 있습니다. 비주얼은 실제로 큽니다. 그래서 RenderTargetBitmap의 생성자가 "처리하는 동안 이미지 데이터가 오버플로를 생성했습니다"라는 예외를 발생시키기 때문에 전체 크기의 비트 맵을 만들 수 없습니다.

마지막으로 작은 비트 맵을 생성하여 시각적으로 표현했습니다. 그러나 문제는 동일합니다 (너무 느리게 작동하고 많은 RAM을 확보합니다).

요소를 렌더링하여 적절한 시간과 소스를 얻으려면 어떻게해야합니까?

감사합니다.

감사합니다.

+0

말하기 어렵다. Visual Studio에서 [분석 도구] (http://msdn.microsoft.com/en-us/library/ms182372(v=vs.100).aspx)를 사용하여 가장 큰 문제를 일으키는 원인을 파악해야합니다. – Will

+0

음 250 * 250 = 62500이며 200Mb가 필요합니다. 750 * 750 = 562500이며 RAM은 10 배입니다. 맞아. 50 만 개의 직사각형 ??? – Phil

+0

@Will 제 코드가 끝까지 작동하고 렌더링 프로세스가 나머지 시간이 걸리기 때문에 주된 문제는 정확히 wpf로 렌더링된다는 것을 이해합니다. – Nick

답변

2

예! 이 문제를 해결할 방법을 찾았습니다! 처음으로 비트 맵을 버퍼로 잘못 사용했습니다. 하지만 이제는 올바르게 사용합니다. 내 코드 : 나는 시각적 임시을 만든

//temp visual 
DrawingVisual tmpVisual = new DrawingVisual(); 
using (DrawingContext dc = tmpVisual.RenderOpen()) 
{ 
    for (Int32 x = 0; x < widthCount; x++) 
      for (Int32 y = 0; y < heightCount; y++) 
      { 
       Color c; 
       Double value = mass[x, y]; 
       c = GetColorByValue(value); 
       dc.DrawRectangle(new SolidColorBrush(c), null, 
        new Rect(x * step - step/2, y * step - step/2, step, step)); 
      } 
} 

//resize visual 
tmpVisual.Transform = new ScaleTransform(maxWidth/(widthCount * step), 
         maxHeight/(heightCount * step)); 

//visual to bitmap 
RenderTargetBitmap bitmap = 
    new RenderTargetBitmap(maxWidth, maxHeight, 96, 96, PixelFormats.Pbgra32); 
bitmap.Render(tmpVisual); 

using (DrawingContext dc = Canvas.RenderOpen()) 
{ 
    Rect rect = new Rect(0, 0, widthCount * step, heightCount * step); 
    dc.DrawImage(bitmap, rect); 
} 

, 그것을 줄이고 비트 맵에 렌더링. 마침내 나는 그것을 시각적으로 펼쳤다.

감사 :이 주제의 덕택으로 Scaling WPF content before rendering to bitmap

관련 문제