Java 处理PImage数组将保留在内存中

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数组。(按小字母键)。如果我按下大写字母,草图应该重置所有内容,或者至少使图像数组为空。但我做不到这一点。内存分配空间,其消耗量不断增长。重置应用程序时,draw调用仍会渲染图像(第18行)。这是我的密码:

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,非常感谢您的帮助!