私はシミュレータに実装しようとした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秒として画面に時間を書いています。
「1000/60」は、16.66667ではなく16を生成します。代わりに '1000/60.0'を試してみてください。 System.currentTimeMillis()には精密な問題がありますが、代わりに 'System.nanoTime()'を試してみてください。 – Thomas
@トーマス私は約135000(135秒)のトレースでdeltaTの値を取得していますが、それは主な問題だと思います。私もそれを実装しますが、ヒントをありがとう。最初はSystem.nanoTime()を使用していましたが、同じ問題がありました。 – Loua
うーん、あなたの 'tick()'と 'render()'のどちらかに時間がかかったり、投稿していないものがあります。それだけでなく、deltaTを0にリセットするので、 'if((currentT-lastT)> = tPerTick){... lastT = currentT; } '? – Thomas