【发布时间】:2014-07-25 16:49:45
【问题描述】:
当直接写入后台缓冲区并在单个锁定/解锁中多次使用 AddDirtyRect 函数时,WriteableBitmaps 似乎存在内存泄漏。矩形需要在位图中定义不同的区域。当您尝试丢弃 WriteableBitmap 时,内存将会泄漏。
您可以通过将以下代码插入新的 WPF 应用程序来重新创建它。当应用程序启动时,调整窗口大小以创建新的 WriteableBitmaps 并观察内存增加。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Image m = new Image();
m.Stretch = Stretch.Fill;
this.Content = m;
this.SizeChanged += OnSizeChanged;
}
private void OnSizeChanged(object sender, SizeChangedEventArgs args)
{
WriteableBitmap bm = new WriteableBitmap((int)args.NewSize.Width, (int)args.NewSize.Height, 96, 96, PixelFormats.Bgra32, null);
bm.Lock();
bm.AddDirtyRect(new Int32Rect(1, 1, 1, 1));
bm.AddDirtyRect(new Int32Rect(2, 2, 1, 1));
bm.Unlock();
((Image)this.Content).Source = bm;
}
}
我们需要能够丢弃位图,因此保留相同的位图并重复使用它不是一种选择。我们也不能直接写入后台缓冲区,而是使用 WritableBitmap.WritePixels(),但它速度较慢,而且速度是个问题。
更新: 我已经测试了 WritePixels 方法,它仍然泄漏。这可能是在不同区域过快调用过多写入的问题。
【问题讨论】:
标签: c# wpf memory-leaks