RenderTargetBitmap内存泄漏
本文关键字:泄漏 内存 RenderTargetBitmap | 更新日期: 2023-09-27 18:02:09
我尝试用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);
我需要帮助我如何释放记忆谢谢大家。
如果您使用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();
这不是真正的内存泄漏,至少在我的经验中是这样。您将在任务管理器中看到内存使用逐渐增加,但是垃圾收集器应该在实际需要时处理它(或者您可以自己调用GC.Collect()来查看发生的情况)。也就是说,如果你正在绘制形状,DrawingContext/DrawingVisuals在WPF中并不理想。你最好使用矢量图形,你会有很多好处,包括可伸缩性和不看到这个内存使用问题。
查看我对类似问题的回答:程序占用太多内存