可变长度的可重复使用缓冲区
本文关键字:缓冲区 | 更新日期: 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);
选项:
- 您可以将图像保存在内存中作为
Bitmap
。实际上没有必要将其序列化为PNG。您可以重用该Bitmap
对象 - 您可以编写自己的类似
MemoryStream
的流,永远重复使用相同的缓冲区
您可以假设裁剪的矩形永远不会大于完整图像的大小,分配它,然后只需记下您当前使用的缓冲区的大小。
或者,您可以拥有一个可以增长但从不收缩的阵列,并且,根据增长的粒度,您不会有太多的重新分配。
您可以查看MemoryStream.cs
,了解它们如何处理容量变化。看看EnsureCapacity()
,如果我读对了,它只会在扩展时分配一个新的数组(该数组是在Capacity
的setter中分配的(。免责声明:我不确定这是否是MemoryStream
的原始来源。