2012-02-28 82 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)); 
     } 
} 

而且它工作正常矩形的數量的情況下是約250×(連帶200MB RAM)。但是,如果它們的數量是750x750,則渲染過程太長且太慢(獲得超過2.5Gb的RAM)

下一步是使用像緩衝區一樣的位圖。但是我的DrawingVisual的大小有問題。視覺真的很大。 所以不可能創建一個完整的位圖,因爲RenderTargetBitmap的構造函數拋出異常「圖像數據在處理過程中產生溢出」。

最後我創建了一個小的位圖並將其拉伸到我的視覺。然而,問題是相同的(它工作得太慢,並獲得大量的RAM)。

我該怎麼做才能使渲染元素的過程獲得足夠的時間和來源?

問候!

謝謝!

+0

很難說。您應該在Visual Studio中使用[分析工具](http://msdn.microsoft.com/zh-cn/library/ms182372(v = vs.100).aspx)來確定是什麼原因導致您遇到最多問題。 – Will 2012-02-28 17:43:46

+0

井250 * 250 = 62500,需要200Mb。 750 * 750 = 562500並且需要10倍的RAM。似乎是正確的。 50萬個矩形? – Phil 2012-02-28 20:41:08

+0

@Will據我所知,主要問題是由wpf完全渲染,因爲我的代碼工作到最後,渲染過程需要休息一段時間。 – Nick 2012-02-29 05:27:51

回答

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