2013-12-08 26 views
0

我正在使用LWJGL和Slick2D編寫遊戲。我剛剛進入了一個我無法擺脫的地方。我曾嘗試加載和播放大小爲3.2MB的OGG音頻文件(如果這一點很重要,該文件最初是MP3文件,但由於MP3的授權問題,我選擇使用OGG代替。我使用this converter將我的MP3到OGG)。我的環境是Eclipse(最新的ADT,但仍然適用於標準Java開發),Mac OSX 10.9 Mavericks。這是我的問題。使用Slick2D加載聲音時發生Java堆錯誤

我用一組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堆空間「異常。我試圖擴展我的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和一個Line:-D)。

哦,我想我應該提到我的遊戲除了加載和播放音頻文件外不會做其他事情。

+0

您使用了哪些轉換軟件?如果其他文件正常工作,那麼您的轉換器可能會破壞數據。嘗試使用[media.io](http://media.io) –

+0

@CasperFærgemand那麼,那個工作過的音頻文件會經過相同的轉換器,以至於較大的文件經歷過。但是,我剛剛嘗試了media.io,但它不起作用。我試圖降低音頻文件的質量,仍然沒有奏效。這個問題不在音頻文件中,因爲GarageBand和Google Chrome可以打開它。我的問題是Java在加載文件時耗盡了所有的內存。 – pjrader1

+0

如果您使用音樂類而不是聲音,它會有所作爲嗎? –

回答

0

我明白了。我相信問題在於Slick2D可能已經解壓OGG AS,它正在從文件流中讀取它,將它的所有內存用完,就像它什麼都沒有。我只是將我的原始MP3轉換成WAV,並將其放入我的項目中。完美工作。它也很快加載了音頻文件,我會假設因爲它不需要解壓任何東西。我也嘗試將MP3轉換成AIFF-C,這仍然奏效(不出所料)。

好消息:我的音頻文件正常工作,加載速度更快。壞消息是:我必須爲未壓縮的音頻類型交換功能,使我的音頻文件比原始MP3大30倍。但是,我個人不關心尺寸,我關心功能。

相關問題