SpriteKits Update-Funktion: Zeit vs. Bildrate

8

Ich bin neu in der Programmierung und im Spritekit im Allgemeinen und bin daran interessiert, die Beziehung zwischen Millisekunden & amp; Framerate und wie die Update-Funktion als Vermittler zwischen beiden verwendet wird.

Framerate vs. Millisekunden

Im Wesentlichen besteht der Hauptunterschied zwischen Framerate und Zeit darin, dass die Zeit immer konsistent ist, während die Framerate nicht ist (sie könnte aufgrund intensiver Grafikprozeduren abfallen). Die Zeit wird jedoch normalerweise während des SKScene-Aktualisierungsereignisses überprüft und eingestellt (jeder Rahmen wird genannt), also versuche ich herauszufinden, wie die Zeit korrekt berechnet wird, wenn Sie nicht wissen, wie viele Frames in einer Sekunde sein werden .

Beispiel

Ich schaue mir gerade das Update-Ereignis eines Space-Shooter-Spiels an, bei dem die Update-Funktion dafür zuständig ist, Zeitintervalle zu zählen, bevor ein anderer Alien erscheint. Sie können den vollständigen Code hier ansehen: Ссылка

%Vor%

Problem

Ich kann nicht herausfinden, warum timeSinceLastUpdate auf 1.0 / 60 gesetzt ist. Ich weiß, dass es mit der Abstimmung zwischen Framerate und Sekunden zu tun hat, aber kann mir das jemand erklären? Warum dürfen wir auch Dezimalzahlen verwenden? Ich dachte, die Zeitintervalle wären vom Typ Int.

Was noch wichtiger ist, ist der Zweck dieses, um das Gameplay davon abzuhalten, während Dips in Framerate zu verlangsamen? Danke fürs Lesen!

    
Tyler Brown 13.08.2014, 21:44
quelle

1 Antwort

10

SpriteKit weiß nicht, wie viele Frames sein werden , aber es kann Ihnen sagen, wie viel Zeit vergangen ist, seit es das vorherige Bild gezeichnet hat . Wenn Ihr Spielcode eine zeitabhängige Logik hat, sollten Sie das wissen. Zum Beispiel machst du etwas wie position += velocity * timeSinceLastUpdate , um Sprites zu verschieben, weil du keine vollständige Physik-Engine brauchst.

Framerate ist Frames pro Sekunde: SpriteKit versucht, Ihr Spiel mit 60 Frames pro Sekunde zu starten. Das bedeutet, dass die Zeit zwischen den Frames 1/60 Sekunden beträgt (etwa 0,01667 Sekunden oder 16,67 Millisekunden). CFTimeInterval ist ein Typalias für Double , also kann es nicht-ganzzahlige Werte haben (und muss, da Sie mit Bildzeiten arbeiten, die Bruchteile einer Sekunde sind).

  

Was noch wichtiger ist, ist der Zweck dies, um das Gameplay davon abzuhalten, während Dips in Framerate zu verlangsamen?

Sie haben den Teil über Framerate Dips richtig gemacht, aber der Effekt ist rückwärts. Sie möchten Ihr Gameplay eigentlich verlangsamen , wenn die Framerate signifikant sinkt.

Wenn ein Raumschiff mit Code wie position += velocity * timeSinceLastUpdate über den Bildschirm bewegt wird, was passiert, wenn wir mehrere Frames nacheinander löschen? Der Wert von timeSinceLastUpdate wird sehr hoch sein, so dass das Schiff eine große Entfernung überspringen wird, anstatt sich nur ein bisschen zu bewegen. Dies ist besonders wahrscheinlich, wenn Ihre App ausgesetzt wird und irgendwann später wieder in den Vordergrund kommt.

Dieser Code überprüft, ob mehr als eine Sekunde seit dem letzten Frame vergangen ist, und wenn dies der Fall ist, wird das Gameplay so fortgesetzt, als wäre das Spiel mit 60 fps ausgeführt worden - das springende Raumschiffproblem vermeiden.

    
rickster 13.08.2014, 23:14
quelle

Tags und Links