使用Slick2D加载声音时出现Java堆错误

时间:2013-12-08 07:28:16

标签: java audio lwjgl openal slick2d

我正在使用LWJGL和Slick2D编写游戏。我刚刚进入了一个我无法摆脱的地方。我曾尝试加载和播放大小为3.2MB的OGG音频文件(如果重要的话,该文件原本是MP3,但由于MP3的许可问题,我选择使用OGG。我使用了{{3}将我的MP3转换为OGG)。我的环境是Eclipse(最新的ADT,但仍适用于标准Java开发),Mac OSX 10.9 Mavericks。这是我的问题。

我用一组45 FPS加载我的游戏,虽然这不应该,因为Slick2D音频加载线程是独立的。在我的游戏初始化(来自Slick2D的BasicGame类)中,为了测试Slick2D的加载资产部分,我加载,然后直接播放3.2MB的OGG声音:

@Override
public void Initialize(GameContainer _gameContainer)
{
    org.newdawn.slick.Sound _testSound = null;
        _testSound = new org.newdawn.slick.Sound("res/Sounds/Menu_Theme.ogg");
    } catch (SlickException e) {
        e.printStackTrace();
    }
    _testSound.play();

}

当我运行游戏时,我得到一个“线程中的异常'主'java.lang.OutOfMemoryError:Java堆空间'异常。我已经尝试将我的JVM内存限制扩展到2048MB,但仍然有相同的异常。请注意,我也尝试在加载后不直接播放声音;仍然有例外(大惊喜)。但是,当我尝试加载一个不同的OGG声音文件时(此文件已经通过了与之前相同的转换器,但是更小:6KB),声音文件加载并正确播放。这让我觉得我无法正常加载我的3.5MB文件?

以下是我程序的完整控制台输出(带有更大的3.5MB音频文件):

Sat Dec 07 23:15:01 PST 2013 INFO:Slick Build #237
Sat Dec 07 23:15:01 PST 2013 INFO:LWJGL Version: 2.9.0
Sat Dec 07 23:15:01 PST 2013 INFO:OriginalDisplayMode: 1280 x 800 x 32 @0Hz
Sat Dec 07 23:15:01 PST 2013 INFO:TargetDisplayMode: 1280 x 800 x 0 @0Hz
Sat Dec 07 23:15:01 PST 2013 INFO:Starting display 1280x800
Sat Dec 07 23:15:01 PST 2013 INFO:Use Java PNG Loader = true
Loading: net.java.games.input.OSXEnvironmentPlugin
Sat Dec 07 23:15:02 PST 2013 INFO:Found 0 controllers
Sat Dec 07 23:15:02 PST 2013 INFO:Initialising sounds..
Sat Dec 07 23:15:02 PST 2013 INFO:- Sound works
Sat Dec 07 23:15:02 PST 2013 INFO:- 64 OpenAL source available
Sat Dec 07 23:15:02 PST 2013 INFO:- Sounds source generated
AL lib: (WW) FreeContext: (0x7ff50f813780) Deleting 64 Source(s)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2786)
    at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:133)
    at org.newdawn.slick.openal.OggDecoder.getData(OggDecoder.java:322)
    at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:835)
    at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:793)
    at org.newdawn.slick.Sound.<init>(Sound.java:87)
    at classicsevolved.Main.Initialize(Main.java:31)
    at com.zerocoolamusement.FaithfulFountain.Game.init(Game.java:45)
    at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
    at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
    at classicsevolved.Main.main(Main.java:65)

所以,我的问题是如何更有效地加载音频文件? Slick2D是否有更好的框架来加载和播放我的游戏中的声音效果? (我不知道OpenAL,但我知道一点OpenGl。只是一点点,足以制作一个Quad和一条线:-D)。

哦,我想我应该提一下,除了加载和播放音频文件外,我的游戏不会做任何其他事情。

1 个答案:

答案 0 :(得分:0)

我现在明白了。我相信问题是Slick2D可能已经解压缩了OGG AS,它正在从文件流中读取它,耗尽它的所有内存,就像它什么都没有。我只是将原来的MP3转换为WAV,并将其放入我的项目中。工作得很完美。它也很快加载了音频文件,我认为因为它不需要解压缩任何东西。我还尝试将MP3转换为AIFF-C,它仍然有效(不出所料)。

好消息:我的音频文件工作正常,加载速度更快。坏消息:我必须交换未压缩音频类型的功能,使我的音频文件比原始MP3大30倍。但是,我个人并不关心尺寸,我关心功能。

相关问题