0

さて、私は基本的なゲームを書いていて、MP3と比較して小さいという事実のためにMIDIサウンドを使用することにしました。また、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

調べたところ、シンクロナイザーを停止した後に使用中のメモリを停止するには、「close」メソッドが必要であることがわかりました。

于 2012-12-17T17:51:33.860 に答える