好的,我正在编写一个基本游戏并决定使用 MIDI 声音,因为它们与 MP3 相比很小。我还决定使用它,因为 Java 托管它自己的 API,而不必使用第三方包含。
但是,当我运行一个通常约为 7000 字节的 MIDI 文件时,我的应用程序可用内存被耗尽,以至于它经常会暂停/中断甚至抛出异常。
我的实现是;
private class Track {
private Sequencer sequencer;
private Sequence sequence;
private int id;
private boolean loop;
public Track(final int id, final byte[] buffer, final boolean loop) throws IOException, InvalidMidiDataException, MidiUnavailableException
{
this.id = id;
this.sequence = MidiSystem.getSequence(new ByteArrayInputStream(buffer));
this.sequencer = MidiSystem.getSequencer();
this.loop = loop;
}
public synchronized boolean destroy()
{
this.id = -1;
this.sequencer = null;
this.sequence = null;
this.loop = false;
return this.sequencer == null;
}
public synchronized boolean play() throws InvalidMidiDataException, MidiUnavailableException
{
return play(loop);
}
public synchronized boolean play(boolean loop) throws InvalidMidiDataException, MidiUnavailableException
{
if(sequencer != null && sequencer.isRunning())
sequencer.stop();
sequencer.open();
sequencer.setSequence(sequence);
sequencer.setLoopCount(Integer.MAX_VALUE);
sequencer.start();
return sequencer.isRunning();
}
public synchronized boolean stop()
{
if(sequencer != null && sequencer.isRunning())
sequencer.stop();
return sequencer != null && !sequencer.isRunning();
}
public synchronized boolean playing()
{
return sequencer != null && sequencer.isRunning();
}
}
目前,我从应用程序中删除了所有与图形渲染相关的内容,以检查那里没有泄漏,但这导致了问题。
对于一个 7000 字节的文件,它实际上就使用了超过 70MB 的 Ram,这可能吗?
要检查有多少可用内存,我只是在绘画;
graphics.drawString("Free: " + Runtime.getRuntime().freeMemory(), 10, 35);
感谢您的帮助,将不胜感激。