2011-04-27 80 views
0

我正在使用Processing。这里是我的草图的全部:处理:内存不足错误

import guicomponents.*; 

PImage backgroundImage; 

void setup() {  
    size(911, 715); 
    backgroundImage = loadImage("Floorplan.png"); 
} 
void draw() { 
    background(backgroundImage); 
    GImageButton[] buttons = { 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10), 
    new GImageButton(this, null, "wm.png", 1, 10, 10) 
    }; 
} 

(这只是为了说明我有这个问题的演示。)如果运行足够长的时间,一个OutOfMemoryError将生成:

An OutOfMemoryError means that your code is either using up too much memory 
because of a bug (e.g. creating an array that's too large, or unintentionally 
loading thousands of images), or that your sketch may need more memory to run. 
If your sketch uses a lot of memory (for instance if it loads a lot of data files) 
you can increase the memory available to your sketch using the Preferences window. 
Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space 
An OutOfMemoryError means that your code is either using up too much memory 
because of a bug (e.g. creating an array that's too large, or unintentionally 
loading thousands of images), or that your sketch may need more memory to run. 
If your sketch uses a lot of memory (for instance if it loads a lot of data files) 
you can increase the memory available to your sketch using the Preferences window. 
    at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41) 
    at java.awt.image.Raster.createPackedRaster(Raster.java:458) 
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015) 
    at sun.awt.image.ImageRepresentation.createBufferedImage(ImageRepresentation.java:230) 
    at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:528) 
    at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120) 
    at sun.awt.image.PNGImageDecoder.sendPixels(PNGImageDecoder.java:531) 
    at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:452) 
    at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246) 
    at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172) 
    at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136) 
Exception in thread "Animation Thread" java.lang.OutOfMemoryError: Java heap space 
    at processing.core.PImage.<init>(Unknown Source) 
    at processing.core.PApplet.loadImageMT(Unknown Source) 
    at processing.core.PApplet.loadImage(Unknown Source) 
    at processing.core.PApplet.loadImage(Unknown Source) 
    at guicomponents.GImageButton.getImages(GImageButton.java:136) 
    at guicomponents.GImageButton.<init>(GImageButton.java:100) 
    at gimage_demo.draw(gimage_demo.java:35) 
    at processing.core.PApplet.handleDraw(Unknown Source) 
    at processing.core.PApplet.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:619) 

为什么会发生这种情况?当数组超出范围时,存储器是否会收集垃圾回收?draw()的末尾?

我试图做一个按钮抽搐时遇到了这个问题。我找不到改变位置的方法,所以我只是在我想要的新位置创建一个新的位置。有一个更好的方法吗?

回答

1

为什么会发生这种情况?当数组在draw()的末尾超出作用域时,内存是否会被垃圾回收?

唯一可以保证的是buttons数组在超出作用域时有资格进行垃圾回收。对于GImageButton对象及其成员,它取决于构造函数具有哪些副作用。

确保构造函数不(在你的情况this)的第一个参数“注册”本身,而没有缓存回事,或者说,GImageButton不会泄漏这是从构造方法中this参考,等等。

1

查看代码(http://code.google.com/p/gui4processing/source/browse/trunk/GUI4Processing/src/guicomponents/G4P.java?r=331),显示所有GImageButton实例存储在一个静态的HashMap中。我看不到一种方式来处理它们(尽管我没有看过那么难)。因此他们不会有资格进行垃圾回收。

我希望答案是(例如,在setup)一旦创建按钮,然后在draw使用它们(除非你能找到一个dispose()方法是等效的)。