如何减少连续 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
我正在构建一个应用程序,每 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