2011-07-15 33 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中並不理想。使用矢量圖形會更好,並且您可以獲得許多附帶優勢,包括可伸縮性並且不會看到此內存使用問題。

見我的答案在這裏一個類似的問題:Program takes too much memory如果您監視使用資源監視器RenderTargetBitmap類的行爲

+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

,你可以看到每個這個類叫,你失去了你的記憶500KB時間。我對您的問題的回答是:不要多次使用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();