Java 处理PImage数组将保留在内存中
我有一个简单的处理草图,图片被读入一个PImage数组。(按小字母键)。如果我按下大写字母,草图应该重置所有内容,或者至少使图像数组为空。但我做不到这一点。内存分配空间,其消耗量不断增长。重置应用程序时,draw调用仍会渲染图像(第18行)。这是我的密码:Java 处理PImage数组将保留在内存中,java,processing,Java,Processing,我有一个简单的处理草图,图片被读入一个PImage数组。(按小字母键)。如果我按下大写字母,草图应该重置所有内容,或者至少使图像数组为空。但我做不到这一点。内存分配空间,其消耗量不断增长。重置应用程序时,draw调用仍会渲染图像(第18行)。这是我的密码: PImage[] images; PImage photo; int counter; void setup() { //Storage of image replicas images = new PImage[0]; //Im
PImage[] images;
PImage photo;
int counter;
void setup()
{
//Storage of image replicas
images = new PImage[0];
//Image instance that gets copied on key press
photo = loadImage("x.png");
size(500, 500);
}
void draw()
{
//Image instance
image(photo,0,0);
for(int i= 0; i < images.length; i++){
//copied instances from images
image(images[i], i*50, 100);
}
}
void keyPressed() {
int keyIndex = -1;
if (key >= 'a' && key <= 'z') {
println("copy iamge and save in PImage Array");
PImage tmpImg = get(0,0,50,50);
images = (PImage[]) expand(images, images.length+1);
images[counter] = tmpImg;
counter++;
}
else if (key >= 'A' && key <= 'Z') {
//attempt to reset image cache
for (int i=0; i< images.length; i++) {
println("attempt to reset cache");
g.removeCache(images[i]);
}
println("attempt to reset PImage Array");
images = null;
images = new PImage[0];
counter = 0;
//attempt to call setup to reset PImage Array
setup();
}
}
PImage[]图像;
皮梅格照片;
整数计数器;
无效设置()
{
//图像副本的存储
图像=新图像[0];
//按键时复制的图像实例
照片=加载图像(“x.png”);
大小(500500);
}
作废提款()
{
//图像实例
图像(照片,0,0);
对于(int i=0;i 如果(key>='a'&&key='a'&&key处理没有自动清除旧帧-它只是在那里的任何东西上绘制。你可以用这个小草图证明:
void draw(){
ellipse(mouseX, mouseY, 10, 10);
}
要清除旧帧,您必须明确告诉Processing绘制背景,如下所示:
void draw(){
background(0);
ellipse(mouseX, mouseY, 10, 10);
}
您的代码实际上是清除旧图像,但您从未清除旧帧,因此它们仍然可见
只需在draw()函数的第一行调用background()函数
至于你的内存使用率上升,这可能是正常的。是内存用完了,还是垃圾收集器最终启动了?此代码(取出视频内容)似乎对我有用。你能发布一篇不包含任何视频内容的文章吗,这样我们就可以在我们的计算机上运行它了?另外,尝试添加打印语句-如果输入了语句,这是不是?嗨,凯文,谢谢你的回复。我试图尽可能地编辑我的文章,使其与MCVE兼容。我唯一无法重新创建的依赖项是我加载的data/x.png o第9行。Thx。就是这样,我真傻。它不会自动清除帧。在原始草图中,我正在使用来自cam的高清分辨率图片,这是内存消耗高的原因。然而,垃圾收集器似乎没有按预期启动,甚至在运行setup()之后Activity Monitor中的内存消耗保持不变。不过,我必须在目标设备上进行压力测试,以查看内存是否已释放或是否遇到严重的内存不足错误。到目前为止,恢复内存的唯一方法是重新启动处理。Thx Kevin,非常感谢您的帮助!