【发布时间】:2020-05-04 21:35:20
【问题描述】:
我有一个包含 3500 个位图的数组。这些位图显示在屏幕上(一个屏幕可以显示 12 个),当垂直滚动条向下时会加载更多位图。 在某些时候,我想从内存中释放这些图像,我想知道 Linq 是否可以提供帮助: 我尝试了什么:
声明:
imageCache = new Bitmap[someCountWithaResultOf3500];
imageCache 由图像加载,然后在某些时候我想处理一些(从开始到当前图像之前的 200 个)。 Id 告诉我显示的第一张图片。
功能
imageCache.AsEnumerable()
.Select((s, j) => new { j, s })
.Where(x => (x.j > 0 && x.j < lowlimit && x.j != null))
.ToList().ForEach(x => Dispose());
lowlimit 是 0 的最大值和所显示图像的 id -200。
当我达到下限时,屏幕变黑,图像消失(在调试模式下,我在 4 点有 lowlimit)
2 个问题:
- 在 where 子句中,我想过滤未处理的位图,怎么做(我的子句
x.j !=null不起作用) -
foreach的 Dispose 是否应该工作?
【问题讨论】:
-
1.
x.j != null并不意味着图像没有被释放,它意味着它不为空。如果您处置某些东西,它不会变为空。 2. 应该是ForEach(x => x.s.Dispose());除了其他一些问题: a) 你不需要打电话给AsEnumerable()。 b) 而不是s,您应该给属性一个更详细的名称,例如bitmap。 c) 我会使用像foreach (var item in imageCache.Select(…).Where(…)) { item.s.Dispose(); }这样的常规 foreach 语句来代替ToList().ForEach(…),以避免分配一次性列表只是为了调用 ForEach 方法。 -
你们的显示技术是什么?如果您在 WPF 或 UWP 中工作,则对此类工作有很好的支持。 | 3500 位图对于人工处理来说似乎太大了。 100 可能是一个更可能的限制。您必须减少任何更多内容,最好不要加载这些内容。
-
如您指定的 WPF;这里有一些关于主题的东西:codeproject.com/Articles/34405/WPF-Data-Virtualization
-
@SebastienChemouny GPU 不重要,因为没有复杂的渲染。它主要是将所有这些图像(未压缩)放入 RAM 中。
-
可能值得一提的是,这是stackoverflow.com/q/61574511/156755 的后续行动,以便为其他人提供一些背景信息。 (这是一个自定义的 Winforms 控件,您在短时间内看到大量图像,您正在使用 [x] 作为缓存,按需加载等...)