0

好的,我正在编写一个基本游戏并决定使用 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);

感谢您的帮助,将不胜感激。

4

1 回答 1

0

在查看它之后,我发现在停止同步器后需要“关闭”方法来停止使用内存。

于 2012-12-17T17:51:33.860 回答