【发布时间】:2013-12-09 03:28:34
【问题描述】:
我正在使用 LWJGL 和 Slick2D 编写游戏。我刚刚进入了一个我无法离开的地方。我尝试加载和播放大小为 3.2MB 的 OGG 音频文件(如果算上,该文件最初是 MP3,但由于 MP3 的许可问题,我选择使用 OGG。我使用 this converter 来将我的 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();
}
当我运行我的游戏时,我得到一个“线程 'main' java.lang.OutOfMemoryError: Java heap space 中的异常”异常。我尝试将我的 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。只是一点点,足以制作一个四边形和一条线 :-D)。
哦,我想我应该提一下,我的游戏除了加载和播放该音频文件之外什么都不做。
【问题讨论】:
-
你用什么转换软件?如果其他文件有效,则您的转换器可能已损坏数据。尝试使用media.io
-
@CasperFærgemand 好吧,那个工作的音频文件通过了与更大文件相同的转换器。但是,我刚才尝试了 media.io,它没有用。我试过降低音频文件的质量,还是不行。问题不在于音频文件,因为 GarageBand 和 Google Chrome 可以很好地打开它。我的问题是 Java 在加载文件时耗尽了所有内存。
-
如果你使用 Music 类而不是 Sound 会有什么不同吗?
-
@CasperFærgemand 没有区别。无论如何,Music 类和 Sound 类之间的唯一区别就是它使用 Slick2D 播放声音的方式。一个在音乐频道中播放,另一个在 OpenAL 频道中播放。使用音乐,您不能同时播放两个音乐效果。使用 Sound,您可以随意播放。
标签: java audio lwjgl openal slick2d