2016-09-28 3 views
0

Javaで固定タイムステップをどのようにする必要がありますか?私は2つの方法があると思う:Javaで固定タイムステップを作成する方法

  1. whileを使って同期化されたゲームループ。
  2. Threadを使用する非同期ゲームループ。

最も重要なことは、パフォーマンス精度です。だから最善の方法は何ですか?

これは同期ゲームループです:

double timeStep = world.getSettings().getStepFrequency(); 
    long lastTime = System.nanoTime(); 

    while (true) { 
     long currentTime = System.nanoTime(); 
     double elapsedTime = (currentTime - lastTime)/1000000000.0; 

     if (elapsedTime >= timeStep) { 
      lastTime = currentTime; 
      world.update(elapsedTime); 
     } 
    } 

これはasynchronisedゲームループです:

double timeStep = world.getSettings().getStepFrequency(); 
    long lastTime = System.nanoTime(); 

    Thread loop = new Thread() { 
     public void run() { 
      while (true) { 
       long currentTime = System.nanoTime(); 
       double elapsedTime = (currentTime - lastTime)/1000000000.0; 
       lastTime = currentTime; 

       world.update(elapsedTime); 

       try { 
        Thread.sleep((long) Math.floor(timeStep * 1000)); 
       } catch (InterruptedException e) {} 
      } 
     } 
    }; 
    loop.start(); 

同期ゲームループは、CPUの多くを使用しています(私は1つのコアを考えることは、私にとって〜25%ですか? )。

非同期ゲームループのCPU使用率はほぼ0%です。

注:私がしたいゲームはWebSocketベースのゲームです。サーバーは物理学用で、HTML5のキャンバスはレンダリング用です。

どのような方法が好きですか?どうして?もっと良い方法はありますか?

+0

精度が必要な場合は、前者を選択する必要があります。 Thread.sleep(例外がない場合)は、スレッドが実行されていない場所の最小値*を設定します。スケジューリングは、それでも任意の時間の間それを遅らせるかもしれません。 –

+0

@DiegoMartinoiaしかし、キャンバスが60FPSでレンダリングすると、スレッドを120Hzで実行するように設定できます。 –

+1

タイマーが最適です。 updateWorldに時間がかかりすぎると、フレームを落とすことができます。 –

答えて

4

定期的にタスクを実行するクラスがJava APIにあります。ホイールを再開発してJava APIを使用しようとしない方が良いです。 ScheduledExecutorServiceが必要なようです。

この例ではRunnable定期的に実行します。

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
executor.scheduleAtFixedRate(myRunnable, initialDelay, period, TimeUnit.MILLISECONDS); 

をあなたの最初の例では、elapsedTime >= timeStepがtrueの場合、あなたのスレッドが倍の膨大な量をチェックしています。最終的に真となるまでこのチェック時間を実行するのではなく、スレッドが待機していて、プロセッサが何か他のもののために使用される可能性があるまで、チェックが行われます。

2番目のオプションは、次の実行までスレッドが待機するため、最初のオプションより優れています。

関連する問題