可变长度的可重用缓冲区

时间:2015-08-13 12:16:25

标签: c# memory-management

  • 我从相机或视频文件中抓取帧。
  • 从每个帧(位图)我想裁剪矩形并将其保存在内存中。
  • 处理新框架时,我不再需要旧的裁剪矩形了。我可以用新的裁剪矩形覆盖它。

显然,我无法为每个帧创建新的字节数组并依赖于垃圾收集,因为我很容易耗尽内存,或者至少内存会非常碎片化。我需要重用一些缓冲区。

如果裁剪矩形的大小是恒定的,那将会很容易,但在每一帧中可能会有所不同(视频中的图像对象跟踪)。

是否有任何API可以帮助我进行内存管理?我尝试重用MemoryStream,但我不确定这是否是正确的方法:< / p>

if (memoryStream == null)
{
   memoryStream = new MemoryStream(1024*10);
}
else
{
   memoryStream.Position=0;   //
   memoryStream.SetLength(0); //"clear" memoryStream, but hopefully keeps underlying buffer allocated/
}

croppedBitmap.Save(memoryStream, ImageFormat.Png);

2 个答案:

答案 0 :(得分:2)

选项:

  1. 您可以将图像作为Bitmap保存在内存中。实际上不需要将其序列化为PNG。您可以重用该Bitmap对象。
  2. 您可以编写自己的MemoryStream - 类似于永久重用相同缓冲区的流。

答案 1 :(得分:1)

你可以假设裁剪的矩形永远不会大于整个图像的大小,分配它,只需要记录你目前使用的缓冲区数量。

或者,您可以拥有一个grow但不会缩小的数组,并且,根据增长的粒度,您将不会有太多的重新分配。

您可以查看MemoryStream.cs,了解它们如何处理容量变化。查看EnsureCapacity(),如果我正确读取它,它只会在扩展时分配一个新数组(该数组在Capacity的setter中分配)。免责声明:我不确定这是否是MemoryStream的原始来源。