显然,我无法为每个帧创建新的字节数组并依赖于垃圾收集,因为我很容易耗尽内存,或者至少内存会非常碎片化。我需要重用一些缓冲区。
如果裁剪矩形的大小是恒定的,那将会很容易,但在每一帧中可能会有所不同(视频中的图像对象跟踪)。
是否有任何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);
答案 0 :(得分:2)
选项:
Bitmap
保存在内存中。实际上不需要将其序列化为PNG。您可以重用该Bitmap
对象。MemoryStream
- 类似于永久重用相同缓冲区的流。答案 1 :(得分:1)
你可以假设裁剪的矩形永远不会大于整个图像的大小,分配它,只需要记录你目前使用的缓冲区数量。
或者,您可以拥有一个grow但不会缩小的数组,并且,根据增长的粒度,您将不会有太多的重新分配。
您可以查看MemoryStream.cs
,了解它们如何处理容量变化。查看EnsureCapacity()
,如果我正确读取它,它只会在扩展时分配一个新数组(该数组在Capacity
的setter中分配)。免责声明:我不确定这是否是MemoryStream
的原始来源。