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)); 
     } 
} 

そしてそれは長方形の量の場合には正常に動作(それは200MBのRAMを取得する)約250×250です。しかし、それらの数が750x750なら、レンダリングのプロセスが長すぎて遅い(2.5Gb以上のRAMを取得する)

次のステップでは、バッファーのようなビットマップを使用していました。しかし、私のDrawingVisualのサイズには問題があります。ビジュアルは本当に大きいです。 したがって、RenderTargetBitmapのコンストラクタがException "処理中にオーバーフローを生成しました"という例外をスローするため、フルサイズのビットマップを作成することはできません。

最後に小さなビットマップを作成し、それを私の視覚に引き伸ばしました。しかし、問題は同じです(処理が遅すぎ、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

@ウィル私の主な問題は、コードが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); 
} 

を私は、視覚的な一時を作成し、それを削減し、ビットマップにそれをレンダリングしています。最後に私はそれを私の視覚に広げた。このトピックへ

I感謝:Scaling WPF content before rendering to bitmap

関連する問題