質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

628閲覧

Eclipse上では軽快に動くのにjarファイルにエクスポートすると鈍重になる

KEN_RP

総合スコア14

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2018/09/04 12:19

概要

JavaFXで音楽ゲーム(所謂音ゲー)を制作しているのですが、MediaPlayerを使ってMediaPlayer.setStartTime()を指定した音楽を再生したとき、Eclipseで実行したときは遅延もほとんど無く再生されるのに、Eclipseで実行可能jarファイルにエクスポートして実行すると、1秒ほどの遅延が発生します。
起動時のVM引数も同じものを指定しており、ファイル構成も全く同じです。
jarファイルを移動してディレクトリを同じにしてみたりもしたのですが改善は見られませんでした。

ソースコード

長いので全体は載せませんが・・・

Java

1public class Main extends Application { 2 public static void main(String[] args) { 3 launch(args); 4 } 5 6 @Override 7 public void start(Stage stage) throws Exception { 8 //ウィンドウ操作関連 9 new AnimationTimer() { 10 public void handle(long currentNanoTime) { 11 frame++; 12 if(frame==60)playmusic(new Duration(50000)); 13 } 14 }.start(); 15 stage.show(); 16 } 17 18 void playmusic(Duration dur){ 19 Media media = new Media(new File("music.mp3").toURI().toString()); 20 MediaPlayer mp = new MediaPlayer(media); 21 mp.setStartTime(dur); 22 mp.setCycleCount(MediaPlayer.INDEFINITE); 23 mp.play(); 24 } 25} 26```大体こんな感じです(かなり省きましたが、メディアの再生はこんな感じでやってます)27体感では、durに渡す値が大きくなればなるほど、メディアの再生も遅れる印象です。 28一番不思議なのが、「Eclipseで実行すると普通に動作する」ということなのですが、原因若しくは解決法が分かる方がいらっしゃれば、ご教授願いたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/09/04 13:36

読み込みファイルのmusic.mp3はJarファイルの中でしょうか。
KEN_RP

2018/09/04 13:44 編集

外部です。音源ファイルはjarと同じ階層にファイルとしておいてあります。
guest

回答2

0

ベストアンサー

原因は私には判断いたしかねますが、推測だけ

  1. Eclipseデバッガは(おそらく)コンパイル済み class ファイルを実行するが、実行可能 Jar は当然 圧縮されたファイル内の class ファイルをロードするので場合によってはメモリへの展開に時間がかかる
  2. そもそもEclipse デバッガはデバッグ開始以前にJVMを起動している可能性がある(音楽だけ遅延しているのではなくプログラムの開始自体が遅延していた?)
  3. Eclipse 同梱JRE と 質問者さまのPVでパスの通っているJRE の性能の違い

それとは別に、音ゲー作成のアドバイス、というとおこがましいですが……
音ゲーのように、音楽の再生タイミングがシビアなものについては、音楽ファイルをロード→即再生 というのはやめたほうが良いです、というか普通そのやりかたでは楽譜と音楽がずれます(しかもずれる量は環境やPCのご機嫌次第!)。

Oracleのドキュメントによると、 MediaPlayer クラスは最低限再生できるだけのロードが完了した段階で status プロパティが READY となってくれるらしいので、せめてそれまでは待ってあげてください。

先に play() メソッドを呼び出しても、READY になるまでお預けをくらうので、確実に不都合なずれ方をします。

できれば、 currentTime プロパティを確認して随時タイミングを調整してください。

コードにするとこんなイメージ↓

Java

1void start(Stage stage){ 2 Media media = new Media(new File("music.mp3").toURI().toString()); 3 MediaPlayer mp = new MediaPlayer(media); 4 mp.setCycleCount(MediaPlayer.INDEFINITE); 5 AnimationTimer timer = new AnimationTimer(){ 6 public void handle(long t){ 7 if(++frame==60) mp.play(); 8 Duration musicTime = mp.getCurrentTime(); 9 //musicTime を用いて楽譜の位置調整など 10 } 11 }; 12 mp.setOnReady(()->{ 13 timer.start(); 14 stage.show(); 15 }); 16}

投稿2018/09/04 14:33

R.Mizukami

総合スコア1077

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEN_RP

2018/09/05 02:08

JREのパスが違っていたのが原因だったようです。ありがとうございました! 音ゲー本体の方は、ソースコードを省略しただけでタイミングの調整(音源ロードから再生まで1秒待機、毎フレームcurrentTimeで位置調整)は既に実装して上手く動いてくれてます。情報が足りなくて申し訳ないです。 アドバイスありがとうございました!
guest

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEN_RP

2018/09/04 13:43

リンク先に載っていることは大体試したのですが、改善は見られませんでした・・・
sazi

2018/09/04 14:30

後は参照しているライブラリが違っているとか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問