Ich habe einige Probleme mit einem FPS-Algorithmus Ich habe versucht, in meinem Simulator zu implementieren. Die allgemeine Idee ist, dass 60 die maximale Menge an Tick-Render-Zyklen pro Sekunde sein soll. Hier ist mein Code:Fps Algorithmus Fehler mit Systemzeit
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
}
Die Konstante ‚tPerTick‘ ist definiert als
double tPerTick = 1000/60
Während meine Entwicklung dieses Programms folgt dachte ich, dass dieser Algorithmus funktioniert perfekt, es war nur, als ich das verfolgt Algorithmus, um zu bestätigen, dass ich ein Problem gefunden habe. Jedes Mal, wenn die Schleife zyklisch läuft (iteriert? Ich bin mir nicht sicher, was das korrekte Wort hier ist), wird die if-Anweisung als wahr befunden und daher wird der Tick-Render-Zyklus ausgeführt. Ich habe etwas mehr verfolgt (um herauszufinden, warum das passierte) und festgestellt, dass die Werte für deltaT immer deutlich über tPerTick liegen, wie weit weg (in einigen Fällen 19 Sekunden, obwohl dies eindeutig nicht der Fall ist). Gibt es irgendwo in meinem Code einen Fehler? Ich denke, dass ich System.currentTimeMillis() falsch verwenden oder den Algorithmus falsch verfolgen muss.
In der aktuellen Simulation scheint es gut zu funktionieren (nicht sicher warum). Wenn ich die Grafiken zeichne, gebe ich 'x' (das Häkchen) ein und schreibe die Zeit als x/60 Sekunden auf den Bildschirm.
'1000/60' ergibt 16 statt 16.66667. Versuchen Sie stattdessen '1000/60.0'. Abgesehen davon, dass 'System.currentTimeMillis()' einige Genauigkeitsprobleme hat, versuchen Sie 'System.nanoTime()' stattdessen (oder erhalten Sie Nano-Sekunden, dann denken Sie daran). – Thomas
@Thomas Ich bekomme Werte für DeltaT in meiner Spur von etwa 135000 (135 Sekunden), ich denke, das ist das Hauptproblem. Danke für den Tipp, aber ich werde das auch umsetzen. Zuerst verwendete ich System.nanoTime() und hatte das gleiche Problem. – Loua
Hmm, entweder deine 'tick()' und 'render()' nehmen eine sehr lange Zeit in Anspruch oder es gibt etwas, was du nicht gepostet hast. Da Sie deltaT sowieso auf 0 zurücksetzen, überprüfen Sie, warum nicht einfach 'if ((currentT - lastT)> = tPerTick) {... lastT = currentT; } '? – Thomas