2016-04-01 9 views
0

私はシミュレータに実装しようとしたFPSアルゴリズムに問題があります。一般的な考え方は、1秒間にティックレンダリングサイクルの最大量を60にすることです。システム時間でのFpsアルゴリズムエラー

public void run() { 

    x = 0; //tick is set to 0 originally 
    lastT = System.currentTimeMillis(); //system time in milliseconds 

    //tick-render cycle 
    while(running == true){ 

     currentT = System.currentTimeMillis(); 
     deltaT += currentT - lastT; 
     lastT = currentT; 

     if(deltaT/tPerTick >= 1){ 
      tick(); 
      render(); 
      deltaT = 0; 
     } 

    } 

    stop(); //stops thread when running =! true 
} 

定数「tPerTick」私は私がこれをトレースしたときにそれだけだった、このアルゴリズムは完全に働いていたと考え、このプログラムの私の開発を通して

double tPerTick = 1000/60 

を次のように定義されています。ここに私のコードです私が問題を発見したことを確認するアルゴリズム。ループのサイクルが繰り返されるたびに(正しい単語が何であるかわからない)、if文が真であることがわかり、したがってティックレンダリングサイクルが実行されます。私はいくつかのトレースを行い(なぜこれが起きているのかを知るために)、deltaTの値は常に途中で(たとえ明らかにそうではないにしても19秒で)tPerTickを上回っていることがわかりました。私のコードのどこかにエラーがありますか?私は、System.currentTimeMillis()を間違って使用するか、アルゴリズムを間違ってトレースする必要があります。

実際のシミュレーションでは、うまく動作しているようです(理由は不明です)。私がグラフィックスを描くときに、x(目盛り)を渡し、x/60秒として画面に時間を書いています。

+0

「1000/60」は、16.66667ではなく16を生成します。代わりに '1000/60.0'を試してみてください。 System.currentTimeMillis()には精密な問題がありますが、代わりに 'System.nanoTime()'を試してみてください。 – Thomas

+0

@トーマス私は約135000(135秒)のトレースでdeltaTの値を取得していますが、それは主な問題だと思います。私もそれを実装しますが、ヒントをありがとう。最初はSystem.nanoTime()を使用していましたが、同じ問題がありました。 – Loua

+0

うーん、あなたの 'tick()'と 'render()'のどちらかに時間がかかったり、投稿していないものがあります。それだけでなく、deltaTを0にリセットするので、 'if((currentT-lastT)> = tPerTick){... lastT = currentT; } '? – Thomas

答えて

1

私自身の質問に答える。

System.currentTimeMillis(); 

現在のシステム時刻を取得します。デバッグモードでアルゴリズムを手動で実行する場合、 'deltaT'はアルゴリズムを手動でトレースするのにかかる時間と同じになるため、非常に大きくなります。

+0

はい、デバッガでステップ実行するとその効果があります:) - 私が知らなかった少なくとも2つの事柄があったので、あなたがエラーを見つけたことを知っておいて、それは難しいでしょう。あなたは 'System.currentTimeMillis()'について誤解しているようです。 – Thomas

関連する問題