5

私はJavaでシミュレーションを書いています。これにより、オブジェクトはニュートン物理学の下で動作します。オブジェクトに力が加えられ、その結果生じる速度によって、オブジェクトが画面上を移動する場合があります。シミュレーションの性質は、アニメーションループの現在の反復と前の反復の間で経過した時間に応じて、オブジェクトが個別のステップで移動することを意味します。例えば

public void animationLoop() {
  long prev = System.currentTimeMillis();
  long now;

  while(true) {
    long now = System.currentTimeMillis();
    long deltaMillis = now - prev;
    prev = now;

    if (deltaMillis > 0) { // Some time has passed
      for (Mass m : masses) {
        m.updatePosition(deltaMillis);
      }

      // Do all repaints.
    }
  }
}

アニメーションスレッドが何らかの方法で遅延し、長い時間が経過すると問題が発生します(Windowsの場合、最小化/最大化をクリックして押し続けると再描画が妨げられます)。これにより、オブジェクトが驚くべき速度で移動します。私の質問:ウォールクロック時間ではなくアニメーションスレッドで費やされた時間を決定する方法はありますか、または誰かがこの問題を回避するための回避策を提案できますか?

これまでの私の唯一の考えはdeltaMillis、いくつかの上限によって制約することです。

4

4 に答える 4

6

ループで回転する代わりに、タイマーのようなものを使用することを検討しましたか?

TimerTask tt = new TimerTask(){
  long prev = System.currentTimeMillis();
  public void run(){
    long now = System.currentTimeMillis();
    for (Mass m : masses) {
      m.updatePosition(now-prev);
    }
    prev = now;
  }
}

new Timer(true).schedule(tt, 1000, 1000) ;

このようにして、オブジェクトの更新の間に少なくともある程度の遅延があることが保証されるため、while(true)ループのように連続して大量の再描画を行うべきではなく、スレッドが遅延した場合、すぐに再描画されることはありません。 -ドキュメントからのタスクの実行:「固定遅延実行では、各実行は前の実行の実際の実行時間に関連してスケジュールされます。」

于 2010-04-14T12:22:46.720 に答える
3

私はこれにjavax.swing.Timer.html特に役立ちました。これは、球形の粒子とコンテナの壁の間の弾性衝突をモデル化する例です。

補遺:この関連するアプローチは、モデルをビューから切り離すのに役立つ場合があります。別のスレッドがシステムの進化をモデル化し、ビューはモデルの「スナップショット」を固定レートでレンダリングします。

いずれの場合も、最も遅いターゲットプラットフォームに対応するためにレートを制限します。

于 2010-04-14T14:43:35.427 に答える
1

「Java:ThreadMXBeanを使用したスレッド時間の取得」というタイトルのこの記事を読むことをお勧めします。

基本的に、特に時間を費やすことができるクラスThreadMXBeanThreadがあります。私はそれを試していませんが、方法(および私が言及した記事の例)は有望に見えるので、これであなたが望むことを達成できると思います。

于 2010-04-15T11:17:09.043 に答える
0

車輪の再発明の代わりに、アニメーションを行うためにアニメーションライブラリを使用します。ここに2つの良い選択があります:

于 2010-07-27T01:49:01.470 に答える