8

前段时间我发布了一个与 WriteableBitmap 内存泄漏相关的问题,虽然我收到了与该问题相关的精彩提示,但我仍然认为存在严重的错误/(我犯的错误)/(混淆)/(其他一些事情)这里。

所以,这又是我的问题:

假设我们有一个带有图像和按钮的 WPF 应用程序。图像的源是一个非常大的位图(3600 * 4800 像素),当它在运行时显示时,应用程序消耗约 90 MB。

现在假设我希望从图像源(真正的大图像)实例化一个 WriteableBitmap,当这种情况发生时,应用程序会消耗大约 220 MB。

现在到了棘手的部分,当对图像的修改(通过 WriteableBitmap)结束时,对 WriteableBitmap 的所有引用(至少我知道的那些)都被销毁(在方法结束时或通过设置它们为 null)应该释放 writeableBitmap 使用的内存,并且应用程序消耗应该返回到 ~90 MB。问题是有时它会返回,有时它不会。

这是一个示例代码:

// The Image's source whas set previous to this event
private void buttonTest_Click(object sender, RoutedEventArgs e)
    {
        if (image.Source != null)
        {
            WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source);

            bitmap.Lock();

            bitmap.Unlock();

            //image.Source = null;
            bitmap = null;
        }
    }

如您所见,引用是本地的,应该在方法结束时释放内存(或者当垃圾收集器决定这样做时)。但是,该应用程序可能会消耗约 224 MB,直到宇宙尽头。

任何帮助都会很棒。

4

1 回答 1

0

是否需要以相同的分辨率和像素渲染位图图像?您可以在低得多的像素集上创建​​ writeablebitmap 并调用 render 方法。由于 writeablebitmap 在调用渲染时携带对原始 uielements 的引用,在这种情况下,您将拥有 3 个块:1) 原始 uielement,2) writeablebitmap 中的像素,3) 对复制的原始的引用。

在内存泄漏方面,我对 writeablebitmap 有类似的问题,我通过查看此链接修复了它:http: //www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s -big-image-problem-and-what-you-can-do-about-it.aspx

如果您创建另一个 writeablebitmap 并复制像素,然后处理第一个 writeablebitmap,您应该会看到一些内存释放 - 至少在我的场景中是这样。

于 2010-03-11T04:15:00.080 回答