質問: new javafx.scene.layout.VBox(btnPlay); vbox.setAlignment(javafx.geometry.Pos.CENTER); stage.setHeight(100); stage.setWidth(275); stage.setTitle("クリック音テスト"); stage.setScene(new javafx.scene.Scene(vbox)); stage.show(); } } ``` ### 質問 1. 現在のラグの原因はなんでしょうか? 2. ラグを人間が気にならないようなレベルにするにはどうすればいいでしょうか. **具体的なソースコードをつけて解答いただけると幸いです.** ### 補足など 2016/10/18 22:10 質問内容を追加しました.
回答: 長時間再生するような巨大なサウンドクリップなら再生開始時にスレッド開始、クリップ読み込み(と並行して再生開始)というふうにすると思いますが、即座に再生したいような短いサウンドクリップならあらかじめメモリーに読み込み即座に再生を開始するべきだと思います。 スレッドを起動する時間も気になるほど大きいなら常時専用スレッドを起動しておく方がよいかも知れません。スレッドプールサポート用クラスもあるのですが、もし大がかりなマルチスレッドのアプリケーションを作るのではなくとりあえずサウンドクリップを鳴らすだけといったものであれば自前で一つスレッドを起こして処理したほうがかえって簡単な気がします。 追記: UIスレッドから別スレッドをたたき起こすというのが最初難しいと思うのでその例をかいてみます。必ずしもよいコードではないのでもっとスッキリした書き方もあるようにも思いますが。コメントつける代わりに変数やメソッド名に日本語つかってます。 クリップを一度だけロードして繰り返し鳴らすのはClipのリファレンスをみてトライしてみてください。 ``` class Boo { Object lock = new Object(); boolean 鳴らすのは今; public static void main(...) { Thread t = new Thread(() -> クリップスレッドの処理()); t.setDaemon(true); t.start(); ... 画面をつくって表示 } // 鳴らしたいときJavaFXアプリケーションスレッドからこれを直接呼び出せます static void クリップスレッドさん再生してください() { synchronized (lock) { 鳴らすのは今 = true; lock.notify(); } } void クリップスレッドの処理() { try { for (;;) { // アプリケーション終了まで無限ループ synchornized (lock) { lock.wait(); } System.out.println("デバッグ用: スレッドが起きました"); if (鳴らすのは今) { 鳴らすのは今 = false; ...音を鳴らす処理 } } } catch (InterruptedException e) { ; } } } ```