我定期从类似相机的设备接收数据(如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()
- >没有泄漏到目前为止我已经尝试过去除泄漏(广告没有修复它):
ImageSourceGenerator
静态并将其包装到using()
- 阻止GC.Collect()
如何修复此内存泄漏?
答案 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;
}
}