【问题标题】:RenderTargetBitmap Memory LeakRenderTargetBitmap 内存泄漏
【发布时间】:2011-10-06 12:45:35
【问题描述】:

我正在尝试使用 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);

我需要帮助 我怎样才能释放内存 谢谢大家。

【问题讨论】:

    标签: c# wpf memory memory-leaks rendertargetbitmap


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    如果您使用 Resource Monitor 监控 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();
    

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2013-01-20
      • 2011-10-31
      • 2019-08-10
      • 2013-06-24
      相关资源
      最近更新 更多