質問: 初めて利用させていただきます。よろしくお願いいたします。 シューティングゲーム(リアルタイムで動くような処理)を作っていまして、困っています。 javax.sound.sampledを利用してwavを鳴らしています。 そのwav自体は1秒程度で鳴り終わり、数秒後に再利用しています(javax.sound.sampled.clip.setFramePosition(0); → clip.start();) JavaFXに置き換えるため、mp3化を検討しているのですが、上記と同じように再利用を行うと(javafx.scene.media.mediaPlayer.seek(Duration.ZERO); → mediaPlayer.play();)、一瞬、他の処理が止まってしまい(カクカクする)、使い物になるとはいえない状態となります。 (ちなみに、JavaFX(javafx.scene.media.mediaPlayer)でwavを鳴らしても、同じような状況となります) カクカクを回避する方法はありますでしょうか? よろしくお願いいたします。
回答: >mediaPlayer.play()メソッド自体が、synchronizedされてますし・・・。 synchronizedは単に「俺がこれを使ってる間、他のスレッドはこれを使うな」という意味だ。 確かに内部的に特殊なことをしているが、synchronized=重いメソッドとはならない。 シークして再利用せず、1回ごとに別のMediaPlayerインスタンスに再生させるとどうなんだろう? 以下を最初とrun()から呼ぶようにでもすると? void playMedia() { (mediaPlayer = new MediaPlayer(media)).play(); } あと、使っているのがJava8ならRunnableの生成はラムダ式で単純化できるので、 この際一緒に覚えてもいいかもしれない。 javafx.application.Platform.runLater(this::playMedia);