Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Threadにおける音楽ファイルの乱れについて

シューティングのようなゲームを作っているのですが、Threadを使ってMIDIファイルを流しながら、そのプログラムを動かすと音が途切れたり、リズムがめちゃくちゃになって演奏されます。
これはJAVAの仕様としてとらえるしかないのでしょうか・・・?
もし解決策がありましたら、教えていただけると幸いです。

音楽のThreadのソースは以下のようにしています。

public class MusicThread implements Runnable{
@Override
    public void run(){
        MidiFilePlayer player=new MidiFilePlayer();
        player.play("Bi2ssd.mid");
        sleep(1000000);
        player.bye();
        System.exit(0);
    }
        static void sleep(long t){
            try{
              Thread.sleep(t);
            }catch(InterruptedException e){
              System.out.println("Err="+e);
            }
        }
}    
//music
class MidiFilePlayer{
  Sequencer sequencer;
  MidiFilePlayer(){
    try{
       sequencer = MidiSystem.getSequencer();
       sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
       sequencer.open();
    }catch(MidiUnavailableException e){
      System.out.println("Err="+e);
    }
  }

  void play(String name){
    try{
      FileInputStream in=new FileInputStream(name);
      Sequence sequence=MidiSystem.getSequence(in);
      in.close();
      sequencer.setSequence(sequence);
      sequencer.start();
    }catch(Exception e){
      System.out.println("Err ="+e);
    }
  }

  void stop(){
      if (sequencer.isRunning()){
        sequencer.stop();
      }
  }

  void bye(){
    stop();
    sequencer.close();
  }
}

5

回答

81392

閲覧

5件の回答

評価

0

MIDI再生用のスレッドだけしか動かさない場合はどうか等を
調べてみたでしょうか?

その場合も音がとぎれますか?

評価

0

再生用のスレッドだけであれば問題ないようです。プログラムはそんなに重いものではないのですが、やはり動かしてるプログラムの判定回数などが問題なのでしょうか?

評価

0

よほど高頻度で重い処理をしていれば別ですが単に判定回
数がどうかといったレベルでは問題にならないと思いま
す。

プログラムはそれほど重くないとのことですが、こういっ
たリアルタイム処理のものだとまずはGCの具合を調べては
いかがでしょうか。

VM起動パラメータに以下を指定するとGCが発生するたびに
標準出力にGCが発生した旨とかかった時間がレポートされ
るので簡単にわかります。

-verbose:gc

GCには大雑把にいってすぐに終わるものと長くかかるもの
があります。非常に大雑把ですが、短い方は簡単なアプリ
ケーションであれば10ミリ秒とかで終わってしまうと思い
ます。これが多少あっても簡単には音飛びしない気がしま
す。(記憶があやふやですが、多分JDKのソフトシンセサ
イザーのレイテンシーはかなり長めだった気がするのでた
まに10ミリ秒程度のGCが入ってもそれだけで簡単に音飛び
にはならないという感触です。)しかし長くかかる方のGC
が発生すると秒オーダーの時間がかかったりもするので音
飛びの原因になる気がします。


ところで、性能問題ですので、こういった質問では
OS,CPU(コア数),搭載メモリー等々の環境についても一応
は明示しておいた方がよろしいかと思います。

評価

0

スレッドのプログラムをクリック判定とは関係ないところに移動したら、ぶれなくなりました!
やはり時間がかかっていたみたいです・・・。

時間のレポートについては知らなかったので勉強になりました、ありがとうございます!
活用していきたいと思います。

評価

0

今回は関係ないが、closeの記述位置について基本ができてな
いようなので、勉強しておこう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。