2016-04-01 10 views
0

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.

+0

'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

+0

@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

+0

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

Antwort

1

Beantworten meiner eigenen Frage.

System.currentTimeMillis(); 

Ruft die aktuelle Systemzeit ab. Wenn Sie den Algorithmus manuell im Debug-Modus durchlaufen, wird "deltaT" sehr groß, da er der Zeit entspricht, die Sie für die manuelle Verfolgung des Algorithmus benötigen.

+0

Ja, das Durchlaufen mit einem Debugger hat diesen Effekt :) - Gut zu wissen, dass Sie den Fehler gefunden haben, wäre es für mich schwer gewesen, da es mindestens zwei Dinge gab, die ich nicht kannte: Sie hatten das Problem nur beim Debuggen und Sie scheinen ein falsches Verständnis von 'System.currentTimeMillis()' gehabt zu haben. – Thomas