首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderTargetBitmap内存泄漏

RenderTargetBitmap内存泄漏
EN

Stack Overflow用户
提问于 2011-07-16 06:34:03
回答 2查看 4K关注 0票数 4

我尝试用RenderTargetBitmap渲染图像,每次我从RenderTargetBitmap创建一个实例来渲染图像时,内存都会增加,当我完成时,内存永远不会释放,这是代码:

代码语言:javascript
复制
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);

求求你,我需要帮助,我该如何释放内存,谢谢大家。

EN

回答 2

Stack Overflow用户

发布于 2014-07-22 04:53:51

如果使用资源监视器监视RenderTargetBitmap类的行为,则可以看到每次调用该类时,都会丢失500KB的内存。我对你的问题的回答是:不要使用RenderTargetBitmap类这么多次

你不能通过事件释放RenderTargetBitmap的已用内存。

如果您确实需要使用RenderTargetBitmap类,只需在代码末尾添加以下代码行即可。

代码语言:javascript
复制
        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()

这可能会解决您的问题:

代码语言:javascript
复制
    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();
票数 3
EN

Stack Overflow用户

发布于 2011-07-16 14:00:55

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

请看我对类似问题的回答:Program takes too much memory

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6713868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档