0

我正在用 Java 编写 2D 游戏,但无法将图像加载到图像处理程序中。首先,我想说系统可以正常工作,直到我开始加载超过 15 张图像。

我有一个 AnimationHandler 类,它被赋予了图像的名称和路径,并且应该将它们加载到 Animation 类中并存储这些动画。我这样做是为了让我的游戏中的每个对象实例都可以使用相同的动画,而不是单独加载它们。

无论如何,我的问题是当我尝试加载大量图像时(我将解释为什么我将在一秒钟内拥有这么多图像。)我收到以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我正在加载图像:

BufferedImage im = ImageIO.read(getClass().getResources(imgName));

我将不得不加载这么多图像的原因是因为 a) 每帧一张图像或每个动画至少一张更大的图像。b)一些动画(例如背景)很大,所以我把这些动画的每一帧都分成了几部分。

从我看到的情况来看,任何人似乎得到的唯一响应是增加 JVM 可用的内存量,但我还没有构建 .jar 文件,我正在从 NetBeans 执行并且不知道如何从 NetBeans 内部更改它。

此外,它加载图像的方式是为每个正在加载的图像创建一个新线程。我不知道这是否会有所帮助,但有没有办法跟踪当前正在加载的图像数量,并根据该数字选择等待加载下一张图像?

任何帮助将不胜感激,谢谢彼得

编辑:继承人完整的堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:59)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1263)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1560)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1374)
at Loaders.ImageLoader.loadImage(ImageLoader.java:25)
at MediaHandlers.AnimationHandler.loadAnimation(AnimationHandler.java:53)
at MediaHandlers.AnimationHandler.initAnimations(AnimationHandler.java:38)
at MediaHandlers.AnimationHandler.<init>(AnimationHandler.java:22)
at Main.PlatformGame.<init>(PlatformGame.java:90)
at Main.PlatformGame.main(PlatformGame.java:105)
4

1 回答 1

1

更改 Netbeans 中的设置;

  • 右键单击主项目节点
  • 选择“属性”
  • 选择“运行”节点
  • 将您的内存要求添加到该VM Options字段......即-Xms128M -Xmx1024M

至于你的加载过程。如果您还没有这样做,我会使用ExecutorService来加载图像(可能是一个固定的线程池服务)。

一般来说,它会让事情变得更容易管理,也有助于限制失控线程的数量(因为在某些时候,拥有大量线程并没有带来更多的性能优势而不是没有线程)

于 2012-08-30T04:51:19.750 回答