在处理大量图像时“内存不足”

时间:2012-07-31 22:42:22

标签: java processing

我正在尝试运行一个草图,它应该在封面流动画中显示图像(png,大小在100kb到1,5mb之间,总共55.4mb)。它适用于大约10个图像,但使用更多我得到内存不足的错误。我正在将图像文件名加载到字符串数组中,如下所示:

String[] names = {"00.jpg", "01.jpg", "02.jpg"};

然后将它们加载到草图中,如下所示:

covers = new Cover[names.length];
  for (int i = 0; i < covers.length; i++ ) {
  covers[i] = new Cover(names[i]);
}
initCovers();

涵盖课程:

class Cover {
  PImage img;

Cover( String name ) {
img = loadImage(name);

public void drawCover() {
  beginShape();    
    textureMode(NORMALIZED);
    texture(img);
    vertex(-300, -300, 0, 0, 0);
    vertex( 300, -300, 0, 1, 0);
    vertex( 300,  300, 0, 1, 1);
    vertex(-300,  300, 0, 0, 1);
  endShape();

当我运行草图时,我的ram(8gb)在几秒钟内被填满,草图甚至没有加载,它只是崩溃。当我用大约10张图像开始绘制草图时,一切正常(大约使用1,5gb的ram)。

我的问题是:为什么要使用这么多内存?这是正常的吗?有没有办法让它运行更高的内存效率(例如,当前未显示的图像的释放内存,因为我们一次只能在屏幕上看到3张图像)。

编辑:我认为问题在于,在封面类中,每次调用它时都会创建一个新的PImage。这有可能吗?

内存中的图像尺寸:宽度*高度*(颜色深度/ 8),因此对于我的图像(1575y1969,24位),它们将是8,9mb。时间91张图片:仅用于图像的大约807mb的内存使用量。

4 个答案:

答案 0 :(得分:3)

现在我更了解用例,我建议改变整个方法。

Cover Flow GUI

您尝试模拟的applications类型(例如上面所示) 在应用时立即加载整个图像。被表达。相反,他们首先阅读了他们将要呈现给用户的一小组图像。当用户接近该组的末尾时,软件会在序列开始时刷新一些图像(如果内存紧张)并在结束时加载更多图像。

答案 1 :(得分:1)

尝试增加JVM堆空间

java -Xmx1024m

(是的,我知道,1gig是'过小',但经过一些实验,可以减少这个值。

正如@millimoose所说,Java加载的图像在加载时会被压缩到内存中,所以即使是一张100kb的小图像,在未压缩时也会突然占用RAM的mb。当你开始处理alpha通道时,它会变得更加复杂。

答案 2 :(得分:1)

压缩图像的大小不是内存要求的良好指南。

像素的大小更好。例如,具有8百万像素分辨率的现代相机照片需要至少32mb的存储器来表示。如果你正在操纵这个尺寸的图像,至少是摆动,双倍或三倍。很容易吞噬大量的记忆。

此外,Java的内部内存管理在处理这种大小的块时并不是很好。

答案 3 :(得分:0)

我想说尝试使用单个临时封面作为手柄将它们绘制成一个组件,而不是让N多个对象悬挂?如果您需要在绘制时间之后与图像进行交互,请暂停一些关于其绘制位置和尺寸的简单元数据,然后使用单击事件x,y等查找给定图像以允许您使用它。