【问题标题】:Memory Management List<byte[]> vs List<Bitmap>内存管理 List<byte[]> vs List<Bitmap>
【发布时间】:2017-08-07 16:59:37
【问题描述】:

我有一个这样定义的位图列表:

List<Bitmap> bmpList = new List<Bitmap>();

void CameraWindow_NewFrame(ref Bitmap newFrame)
{
  bmpList.Add((Bitmap)newFrame.Clone());
}

我用 20-50,000 个位图填充这个列表,大约每分钟一次或两次。问题是我没有时间循环浏览列表中的每个位图并处理它。我只有时间清理清单。 GC会清理这个吗?将位图转换为 byte[] 并将它们存储在列表中是否有任何优势?提前感谢您的意见。

【问题讨论】:

  • 你没时间处理?处置需要多长时间?无论如何,字节数组是可以的,因为你不需要在那里处理。我很想知道您是如何将位图添加到列表中的。
  • 如果你不能处理它们,你应该重复使用这些位图
  • 嘿特雷。是的,循环遍历该列表并处理每个列表需要 5 秒左右的时间。我正在从相机中添加它们。我将添加上面的代码。
  • 不可能存储那么多位图。查看“输出”窗口,您很可能会看到它充满了异常通知。对于典型的相机固件,Bitmap.Clone() 几乎永远不够好,您必须使用 Bitmap(Image) 构造函数进行深层复制。现在你的时间少了很多,相机是一个严肃的数据管道,你必须满足于实用的东西。这不是。
  • 是的,我正在这样做,它有效。也许您使用的是 32 位系统,并且遇到了内存墙。

标签: c# memory bitmap byte


【解决方案1】:

列表的目的是什么?

如果您在一两分钟后创建一个包含新对象的列表,则会改为清除列表。

如果添加的第一个对象也是第一个删除的对象,请使用链表和协程,或者在更新时检查是否应该删除它。

【讨论】:

    【解决方案2】:

    GC 最终会清理它们。然而,留下数千个未处理的位图可能会很快耗尽您的可用内存,使您的应用程序有时会出现故障并变得无响应——您可能希望避免这种情况。

    如果您没有时间在工作线程中正确处理这些位图,您可以启动一个单独的线程来处理您不再需要的那些位图。所以而不是

    bmpList.Clear();
    

    你做了类似的事情

    LaunchThreadToDisposeBitmaps(bmpList);
    bmpList = new List<Bitmap>();
    

    LaunchThreadToDisposeBitmaps 在哪里启动一个新线程,该线程遍历列表并处理每个位图并完成 .

    【讨论】:

    • 最终是关键,我已经做了一个类似的应用程序,如果你没有处理,你的描述和记忆就会变得一团糟。
    • 我完全同意。更新了答案,让我的建议更清晰。
    • 感谢您的反馈。我已经想到了,唯一的问题是我的列表需要在线程完成清除之前使用。 Se,然后我正在考虑拥有多个列表。到目前为止,我能最好地清除一个位图列表而不进行处理是不好的,但清除一个 byte[] 列表没什么大不了的。除非有人告诉我为什么这是个坏主意,否则我会转换它们。
    • 我将 bmpList.Clear() 替换为 bmpList=new List() 正是为了给你一个闪亮的新列表,可以立即使用,而旧的列表会慢慢地在后台处理。转换为 byte[] 并不好,因为它会导致很多额外的开销(你试图逃避的东西)并且可能会更慢和更耗时,然后只是在主线程中一个一个地处理列表元素.
    • 哦,这样可以吗?老实说,我不知道。
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2012-03-29
    • 2012-12-05
    • 2010-12-03
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多