0

Java で 2D ゲームを作成していますが、画像を画像ハンドラーにロードするのに問題があります。まず、システムは 15 枚以上の画像をロードし始めるまで機能します。

画像の名前とパスが与えられ、それらを Animation クラスにロードしてそれらのアニメーションを保存することになっている AnimationHandler クラスがあります。これを行っているのは、ゲーム内のオブジェクトの各インスタンスが、すべてを個別にロードするのではなく、同じアニメーションを使用できるようにするためです。

とにかく、私の問題は、多くの画像を読み込もうとすると(なぜそんなに多くの画像をすぐに取得するのかを説明します)、次のエラーが発生することです。

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

私は次のように画像を読み込んでいます:

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

非常に多くの画像をロードする必要がある理由は、a) フレームごとに 1 つの画像、またはアニメーションごとに少なくとも 1 つの大きな画像があるためです。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 に答える