2011-07-15 38 views
4

はRenderTargetBitmap と私はメモリが増加した画像をレンダリングするためにRenderTargetBitmapからインスタンスを作成するたびに画像をレンダリングしようとしていると行っていたときにメモリが をリリースしたことがないと、これはコードです:RenderTargetBitmapメモリリーク

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
               (int)(renderHeight * dpiY/96.0), 
               dpiX, 
               dpiY, 
               PixelFormats.Pbgra32); 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext ctx = dv.RenderOpen()) 
    { 
     VisualBrush vb = new VisualBrush(target); 
     ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
    } 
    rtb.Render(dv); 

私は助けが必要です どのように私はメモリを解放することができます とありがとうございます。

答えて

0

少なくとも私の経験では、これは本当のメモリリークではありません。タスクマネージャでメモリ使用量が増えているのがわかりますが、ガベージコレクタは実際にそれが必要なときに世話をする必要があります(GC.Collect()を呼び出してこれを確認してください)。つまり、図形を描画している場合、DrawingContext/DrawingVisualsはWPFでは理想的ではありません。ベクタグラフィックスを使用する方がずっと良いでしょうし、スケーラビリティやこのメモリ使用の問題がないなど、多くの副次的な利点があります。あなたはリソースモニタを使用してRenderTargetBitmapクラスの振る舞いを監視する場合、あなたはこのクラスが呼ばれるたびに見ることができる、あなたはメモリの500キロバイトを失うProgram takes too much memory

+1

はあなたに感謝、しかし、これは私が)(GC.Collectを試みたが、メモリを解放するために待っていたが、それは –

+0

ムハンマドをリリースしたことがない、それである 間違っていますあなたはUI以外のスレッドでこれをやっている可能性がありますか?もしそうなら、これは関連するかもしれません:https://connect.microsoft.com/VisualStudio/feedback/details/648683/memory-leak-in-wpf-of-dispatcher-and-mediacontext-objects-resulting-in-win32exceptions – JacobJ

3

は、ここでは同様の質問に対する私の答えを参照してください。あなたの質問に対する私の答えは:RenderTargetBitmapクラスを何度も使用しないでください

RenderTargetBitmapの使用メモリを解放することはできません。

実際にRenderTargetBitmapクラスを使用する必要がある場合は、コードの最後にこれらの行を追加してください。

 GC.Collect() 
     GC.WaitForPendingFinalizers() 
     GC.Collect() 

これはあなたの問題を解決することがあります。

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX/96.0), 
                (int)(renderHeight * dpiY/96.0), 
                dpiX, 
                dpiY, 
                PixelFormats.Pbgra32); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext ctx = dv.RenderOpen()) 
     { 
      VisualBrush vb = new VisualBrush(target); 
      ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); 
     } 
     rtb.Render(dv); 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect();