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

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

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

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

Q&A

解決済

1回答

582閲覧

フレームレートに依存しないゲームループの作成方法

chankane

総合スコア139

JavaFX

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

0グッド

0クリップ

投稿2018/06/10 07:27

前提・実現したいこと

javafxの勉強がてらにゲームを作っております.
そこで疑問に思ったのですが,フレームレートに依存しないゲームループはどのようにしたら実装できるのでしょうか?
処理に遅延が発生した場合,遅延が蓄積されないようにするにはどのような方法をとればよいでしょうか?

大雑把な質問になってしまい申し訳ありません.ただ気になるのでご教授願えませんでしょうか?

考えてみたこと

  1. AnimationTimerを使う

私の環境では60FPSだった.
このクラスのhandleで例えば敵が追ってくるコードを書いたとする.
仮に超クソPCでフレームレート=5だった場合,敵がのろのろ追ってくるということになりかねないだろうか?
遅延が発生した場合,その遅延は蓄積されるのだろうか?

  1. Timelineを使う

16.666666666...という微妙な値をどう扱えばいいのだろうか?
16ms + 17ms + 17ms としたら割り切れるのだがこれもどう実現したらよいのか?
遅延が発生した場合,その遅延は蓄積されるのだろうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

仮に超クソPCでフレームレート=5だった場合,敵がのろのろ追ってくるということになりかねないだろうか?

フレームレートは「JavaFXランタイムに対するヒント」と考えるとよいと思います。実際にどのような頻度で呼び出されるかをJavaFXが保証することはできないだろうと思います。PCの能力、プログラムが対象としているモデルの複雑さ、OS上で動作している他のプログラムの状況等々によって処理の負荷は変わります。実際にやってみるとhandleメソッドが起動されるタイミングも変動することが観察できます。

handleメソッドになぜ引数として「現在のフレームのタイムスタンプ」が渡されるか考えてみてください。フレームレートがJavaFXで充分保証できるようなものだったらこんなものは必要なく、単に何回目のフレームかでよかったはずです。ずれるからこそ「実際に呼び出された時刻がどうだったか」の情報が必要になるわけで、その値に従って適切な計算をするという点がプログラマーが考えるべきことになります。

遅延が発生した場合,その遅延は蓄積されるのだろうか?

いえ、AnimationTimerもTimelineもフレームの遅延が蓄積されないように設計されてます。

16.666666666...という微妙な値をどう扱えばいいのだろうか?

制御すべき値(座標など)は連続値(整数ではなく実数値)として計算するように考えてください。

例えばt0で位置がx0, t1で位置がx1でなければならないなら、t0 <= t <= t1であるようなtのときのxの座標は

(x0 * (t1 - t) + x1 * (t - t0)) / (t1 - t0)

として計算すればよいと考えるのです。Timelineでは実際そのようにして任意の時刻でのプロパティーの値を補間するようになっています。

投稿2018/06/10 10:58

KSwordOfHaste

総合スコア18394

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

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

chankane

2018/08/15 04:55

申し訳ございません.ベストアンサー忘れていました. 大変失礼いたしました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問