RenderTargetBitmap内存泄漏

时间:2011-07-15 22:34:03

标签: c# wpf memory memory-leaks 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);

我需要帮助 我该如何释放内存 并感谢所有人。

2 个答案:

答案 0 :(得分:3)

如果您使用资源监视器监视RenderTargetBitmap类的行为,您可以看到每次调用此类时,您将丢失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();

答案 1 :(得分:0)

这不是真正的内存泄漏,至少在我的经验中。您会在任务管理器中看到内存使用量上升,但垃圾收集器应该在实际需要时进行处理(或者您可以自己调用GC.Collect()来查看这种情况)。也就是说,如果您正在绘制形状,则DrawingContext / DrawingVisuals在WPF中并不理想。你最好不要使用矢量图形,你会有很多副作用,包括可扩展性,而不会看到这个内存使用问题。

在此处查看我对类似问题的回答:Program takes too much memory