4

每次我从 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);

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

4

2 回答 2

3

如果你RenderTargetBitmap使用Resource Monitor 监控类的行为,你可以看到每次调用这个类,你会损失 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();
于 2014-07-21T20:53:51.293 回答
0

至少根据我的经验,这不是真正的内存泄漏。您会在任务管理器中看到内存使用量逐渐增加,但垃圾收集器应该在实际需要时处理它(或者您可以自己调用 GC.Collect() 来查看这种情况)。也就是说,如果您正在绘制形状,DrawingContext/DrawingVisuals 在 WPF 中并不理想。使用矢量图形会好得多,并且您将获得许多附带好处,包括可扩展性并且不会看到此内存使用问题。

在此处查看我对类似问题的回答:程序占用了太多内存

于 2011-07-16T06:00:55.357 回答