【发布时间】:2015-08-13 12:16:24
【问题描述】:
- 我正在从相机或视频文件中抓取帧。
- 我想从每一帧(位图)裁剪矩形并将其保存在内存中。
- 处理新框架时,我不再需要旧的裁剪矩形。我可以用新的裁剪矩形覆盖它。
显然,我不能为每个帧创建新的字节数组并依赖垃圾收集,因为我很容易耗尽内存,或者至少内存会非常碎片化。我需要重用一些缓冲区。
如果裁剪矩形的大小是恒定的,那会很容易,但在每一帧中它可能不同(视频中的图像对象跟踪)。
是否有任何 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);
【问题讨论】:
-
“显然,我不能......依赖垃圾收集” - 哦,所以你已经尝试过并测量了它?愿意分享结果吗?还是您假设 GC 无法完成这项工作?
-
几秒钟后我出现内存不足异常和高内存使用率(数百兆字节)
-
请尝试准确地解释您要做什么。例如,您需要在内存中存储多少帧?
-
@Liero - 啊,所以你的意思是你有内存泄漏,而不是修复它,你会责怪 GC?
-
@ Robinson - 我只想将最后一张裁剪的图像保存在内存中。 @Damien_The_Unbeliever:我不是在责怪 GC。而且我没有内存泄漏,确切地说。但这需要 GC 每秒清理一次内存,效率不高。如果您经常分配大型对象,即使您处置它们或不保留对它们的引用,您也很容易耗尽内存。另一件事是,如果 GC 收集太频繁,它会将许多其他对象移动到更高代,而且也不健康,恕我直言
标签: c# memory-management