如何减少连续 Graphics.DrawImage() 使用的内存量

How to reduce the amount of memory used by consecutive Graphics.DrawImage()

我正在构建一个应用程序,每 3 秒在图片框上显示列表 images 中的三个图像之一,我这样做的方法是将其中一个图像直接加载到图片框使用

drawing.Image = Image.FromFile(images[1]);

然后我使用图形 class 绘制了另外 2 个图像。

void PictureBox_Paint_alarm(object sender, PaintEventArgs e)
        {
            if (rotationCounter > images.Count-1)
                rotationCounter = 0;
            if (rotationCounter != 1)
                e.Graphics.DrawImage(Image.FromFile(images[rotationCounter]), new RectangleF(0, 0, drawing.Size.Width, drawing.Size.Height));
        }

rotationCounter 每 3 秒递增 1,应用程序按预期运行。但是,我注意到随着时间的推移,该程序正在消耗更多内存,直到达到 5 GB,然后又回到 400 KB,图像的平均大小为 450 KB。

问题是我要在只有 2 GB RAM 的系统上部署这个程序

您有一个 images 数组(或非常类似的数组)当前正在存储文件名。而不是这样做,加载图像 一次 并有一个 那些 的数组而不是文件名。这样你就不会经常从文件中重新加载图像。

这也意味着您不会继续创建非常(资源)昂贵的 Image 对象。这些东西实现了 IDisposable,因此在不再需要时将被丢弃。你只是让他们坐在那里直到他们被垃圾收集:

until it reaches 5 Gigabytes then it goes back to 400 KB, the images have an average size of 450 KB.

这正是您在此处描述的内容。

The problem is that I'm going to be deploying this program on a system that only has 2 GB of RAM

这不会成为问题,因为 a) 程序不分配物理内存 b) 垃圾收集器会在内存压力出现时更早启动。

你可以使用GC.Collect();使用垃圾收集器。

此外,如果您声明了对象,您可以在使用后使用 DeleteObject() 将其删除。

这个 link 可能有用: Deleting & Releasing GDI objects