0

下面的代码会产生内存泄漏。

public static BufferedImage mergeImages2(BufferedImage base, Collection<Light> images) {
    BufferedImage output = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = output.createGraphics();
    g.drawImage(base, 0, 0, null);
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1.0f));
    for (Light l : images) {
        g.drawImage(l.LIGHT_IMAGE, l.x, l.y, null);
        l.LIGHT_IMAGE.flush();
    }
    g.dispose();
    output.flush();
    return output;
}

正如我在这里读到的:BufferedImage.getGraphics() 导致内存泄漏,有解决办法吗?.createGraphics() 是问题所在。

这段代码可以经常执行(一个计时器被设置为以 50 毫秒的恒定速率滴答作响,如果灯正在“移动”,它会调用这段代码,但如果灯停留在同一个地方,则跳过此代码)。它运行良好,但每次都会使进程占用内存,这是一个级联进程,最终导致在不到一分钟的时间内从约 180 000 K 内存增加到超过 600 000 K 内存。从图形上看,它工作得很好,直到在某些时候笨拙变得太多(显然)并且 FPS 急剧下降。

现在我已经缩小了这个块产生泄漏的范围,因为评论它的调用会使问题消失。

绘制的基本图像为 1024x561,而灯光的图像相当小(50x50)。到目前为止,我一直在用阵列中的一盏灯对其进行测试。

任何避免内存泄漏的解决方案?

4

1 回答 1

0

正如 Andrew Thompson 评论的那样,这不一定是内存泄漏。垃圾收集器的启动时间可能比您想象的要晚。您可以尝试使用 System.gc() 调用,当灯不移动时,尽管通常不建议调用 System.gc():System.gc() 何时执行任何操作

或者,您可以尝试直接操作 BufferedImage 后面的整数数组(不容易),或者使用其他 API(如 JOGL)。

于 2012-11-27T13:03:03.060 回答