gpt4 book ai didi

加载大量文件时发生 Java ImageIO.read() OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 15:12:10 24 4
gpt4 key购买 nike

我正在用 Java 编写 2D 游戏,但在将图像加载到图像处理程序中时遇到问题。首先,我想说的是,在我开始加载超过 15 个图像之前,系统一直正常工作。

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

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

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)

最佳答案

更改 Netbeans 中的设置;

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

关于您的加载过程。如果您还没有这样做,我会使用 ExecutorService加载图像(可能是 fixed thread pool 服务)。

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

关于加载大量文件时发生 Java ImageIO.read() OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com