定期调用WriteableBitmap.Create()导致内存泄漏

时间:2015-07-28 09:38:21

标签: c# wpf memory-leaks bitmap

我定期从类似相机的设备接收数据(如sbyte[],1000 * 1000px,RGB),我想在WPF应用程序中显示。因此,我每次使用静态类从数据创建BitmapSource(大约5 FPS)。现在看起来垃圾收集器没有处理我不再需要的数据,所以我的应用程序使用越来越多的ram。我想我把记忆韭菜钉在了下面的部分:

void getImageTimer_Tick(object sender, EventArgs e)
{
    if (_sensor == null) return;
    if (!IsImageGenerationEnabled) return;
    if (!_sensor.UpdateAllFrames()) return;

    ColorImage = ImageSourceGenerator.FromRawByte(_sensor.RawData, _sensor.Width, _sensor.Height);
}

public static class ImageSourceGenerator
{      
    public static ImageSource FromRawByte(sbyte[] colorData, int width, int height)
    {
        if (colorData == null) return null;
        return WriteableBitmap.Create(width, height, 96, 96, PixelFormats.Bgr24, null, colorData, width * 3) ;
    }
}

到目前为止,我尝试过将问题缩小范围:

  • 评论_sensor.UpdateAllFrames(),以确保它不是导致泄漏的_sensor。 - >还在泄漏
  • 评论ImageSourceGenerator.FromRawByte() out - >没有泄漏
  • 将静态虚假数据输入ImageSourceGenerator.FromRawByte() - >还在泄漏
  • 始终在null返回ImageSourceGenerator.FromRawByte() - >没有泄漏
  • 减慢FPS速度,同时减缓泄漏

到目前为止我已经尝试过去除泄漏(广告没有修复它):

  • 没有ImageSourceGenerator静态并将其包装到using() - 阻止
  • 在计时器中调用GC.Collect()

如何修复此内存泄漏?

1 个答案:

答案 0 :(得分:1)

不是每次都按BitmapSource.Create创建新的BitmapSource,而是应该重用一个WriteableBitmap:

public static class ImageSourceGenerator
{
    private static WriteableBitmap bitmap;

    public static ImageSource FromRawByte(sbyte[] colorData, int width, int height)
    {
        if (colorData == null)
        {
            return null;
        }

        if (bitmap == null || bitmap.PixelWidth != width || bitmap.PixelHeight != height)
        {
            bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgr24, null);
        }

        bitmap.WritePixels(new Int32Rect(0, 0, width, height), colorData, width * 3, 0);

        return bitmap;
    }
}