可变长度的可重复使用缓冲区

本文关键字:缓冲区 | 更新日期: 2023-09-27 18:07:37

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

显然,我不能为每一帧创建新的字节数组并依赖于垃圾回收,因为我很容易耗尽内存,或者至少内存会非常分散。我需要重新使用一些缓冲区。

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

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

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);

可变长度的可重复使用缓冲区

选项:

  1. 您可以将图像保存在内存中作为Bitmap。实际上没有必要将其序列化为PNG。您可以重用该Bitmap对象
  2. 您可以编写自己的类似MemoryStream的流,永远重复使用相同的缓冲区

您可以假设裁剪的矩形永远不会大于完整图像的大小,分配它,然后只需记下您当前使用的缓冲区的大小。

或者,您可以拥有一个可以增长但从不收缩的阵列,并且,根据增长的粒度,您不会有太多的重新分配。

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