我正在尝试运行一个草图,它应该在封面流动画中显示图像(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的内存使用量。
答案 0 :(得分:3)
现在我更了解用例,我建议改变整个方法。
您尝试模拟的applications类型(例如上面所示) 不 在应用时立即加载整个图像。被表达。相反,他们首先阅读了他们将要呈现给用户的一小组图像。当用户接近该组的末尾时,软件会在序列开始时刷新一些图像(如果内存紧张)并在结束时加载更多图像。
答案 1 :(得分:1)
尝试增加JVM堆空间
java -Xmx1024m
(是的,我知道,1gig是'过小',但经过一些实验,可以减少这个值。
正如@millimoose所说,Java加载的图像在加载时会被压缩到内存中,所以即使是一张100kb的小图像,在未压缩时也会突然占用RAM的mb。当你开始处理alpha通道时,它会变得更加复杂。
答案 2 :(得分:1)
压缩图像的大小不是内存要求的良好指南。
像素的大小更好。例如,具有8百万像素分辨率的现代相机照片需要至少32mb的存储器来表示。如果你正在操纵这个尺寸的图像,至少是摆动,双倍或三倍。很容易吞噬大量的记忆。
此外,Java的内部内存管理在处理这种大小的块时并不是很好。
答案 3 :(得分:0)
我想说尝试使用单个临时封面作为手柄将它们绘制成一个组件,而不是让N多个对象悬挂?如果您需要在绘制时间之后与图像进行交互,请暂停一些关于其绘制位置和尺寸的简单元数据,然后使用单击事件x,y等查找给定图像以允许您使用它。