Sollte die Bildrate die Geschwindigkeit in einer Spiel-Engine beeinflussen?


7

Ich schreibe eine 2D-Game-Engine zum Spaß. Ich kann Animationen mit der Engine ausführen. Wenn ich jedoch die Bildrate (Bilder pro Sekunde) ändere, ändert sich die Geschwindigkeit der Animation.

Ich habe noch nie eine Spiel-Engine verwendet. Ich möchte wissen, ob andere Game-Engines dieses Problem behandeln oder nicht. Wenn nicht, wie hoch ist die ideale Bildrate für ein 2D-Spiel?

Antworten:


13

Nein, die Bildrate sollte die Geschwindigkeit nicht beeinflussen - das Gameplay hängt vollständig von der Videoleistung ab, was katastrophal ist (selbst wenn Sie die Geschwindigkeit begrenzen, können Sie keine Personen steuern, deren Systeme das Spiel mit halber Geschwindigkeit ausführen).

Dieses Problem tritt auf, weil Sie etwas falsch gemacht haben: Ihre Aktualisierungs- / Renderroutinen werden so schnell wie möglich nacheinander ausgeführt, wobei Objekte pro Anruf aktualisiert werden (wenn also die Anrufgeschwindigkeit abweicht, auch ihre).

Ein zeitbasierter Ansatz

Der richtige Weg, dies zu tun, besteht darin, Objekte pro Sekunde zu aktualisieren .

Stellen Sie sich zum Beispiel eine Kugel vor: Im Moment weiß es wahrscheinlich, wie viel es pro Frame bewegen muss. Sie müssen dies in die Bewegung pro Sekunde umwandeln . Wie Sie das machen, ist eigentlich nicht zu kompliziert.

Erstens wird Ihre Kugel mehr als einmal pro Sekunde aktualisiert, daher müssen wir sie tatsächlich alle paar Millisekunden aktualisieren. Jedes Mal, wenn Sie Ihre Physik-Engine aktualisieren, ist seit der letzten Aktualisierung eine bestimmte Anzahl von Millisekunden vergangen: Dies wird als Delta-Zeit bezeichnet , normalerweise kurz dt . Der dt wird vor dem Aktualisieren aller Objekte bestimmt, dann werden alle Objekte mit demselben dt aktualisiert, um synchron zu bleiben. Das dt wird im Allgemeinen als Argument an jedes Objekt in seinem Aktualisierungsaufruf übergeben.

In der Festschrittphysik ist der dt eine feste Zahl, während in der Variablenschrittphysik der dt abhängig von der tatsächlichen Zeitspanne seit der letzten Aktualisierung (daher ihre Namen) variiert.

Das bringt uns zurück zu Ihrer Kugel. Es wurde angewiesen, mit einem dt von 16 Millisekunden zu aktualisieren, für eine Physik-Engine, die 60 Mal pro Sekunde aktualisiert wird: Wenn sich die Kugel 12 Meter pro Sekunde bewegt, bewegen Sie sie (16.0/1000.0) * 12.0in diesem Update Meter.


4
Dieser Ansatz ist aus zahlreichen Gründen nicht ideal. Das Gameplay wird nicht deterministisch sein, was die Multiplayer-Synchronisierung viel schwieriger macht, als es sein sollte. Wenn sich die Aktualisierungsrate ausreichend verlangsamt, können Objekte durch Barrieren tunneln oder Kollisionen, die auftreten sollten, übersprungen werden.
AttackingHobo

Aus diesem Grund kann die verstrichene Zeit (dt) geklemmt werden, dh ab 5 bis 1000 Bildern pro Sekunde funktioniert Ihr Motor ordnungsgemäß. Unterhalb von 5 fps wird die Zeit langsamer (dh der dt wird geklemmt).
Verlangsamte

@ Daniel, es ist immer noch nicht deterministisch, was die Implementierung synchronisierter Netzwerksimulationen oder eines Wiedergabesystems erheblich erschwert. Und wenn Sie ein Puzzlespiel vom Typ Rube Goldberg erstellen, wird die Simulation nach einigen Sekunden nicht jedes Mal auf die gleiche Weise wiedergegeben.
AttackingHobo

Ah, aus irgendeinem Grund dachte ich, er würde einen festen Zeitschritt mit dt-Schritten verwenden ... Also gut, das ist schlecht.
Verlangsamte

5
Um fair zu sein, ist dieser Ansatz mehr als gut genug für alles, was keine komplexe Physik durchführt, und hat in vielen ausgelieferten Spielen funktioniert. Es ist also am besten, sich keine Sorgen darüber zu machen, dass der feste Zeitschritt und das interpolierte Rendern usw.
erforderlich sind

10

Der beste Weg, um Ihr Spiel auf allen Systemen gleich schnell laufen zu lassen, ist die Verwendung eines festen Zeitschritts.

Mit einem festen Zeitschritt wird das Spiel unabhängig von der Renderrate immer mit der gleichen Rate aktualisiert. Bei Verwendung der Interpolation sieht es auch dann flüssig aus, wenn die Renderrate viel höher als die Aktualisierungsrate ist.

Hier finden Sie eine Antwort mit Ressourcen zum Implementieren eines festen Zeitschritts.
Halbfester oder vollfester Zeitschritt?

Hier ist eine Antwort, die erklärt, wie Interpolation für Bewegung und Transformationen implementiert wird.
Wie interpoliere ich zwischen zwei Spielzuständen?


-2

Nein sollte es nicht. Eine Art von Timing, die Sie in Ihrem Spiel ausführen können, ist das rahmenbasierte Timing. Die Idee ist, die Spielschleife so schnell laufen zu lassen, wie Ihr Computer sie ausführen kann, wodurch Sie das beste Gesamterlebnis haben und die Geschwindigkeit steuern, mit der Ihre Simulation ausgeführt wird. Jetzt haben Sie Ihre Aktualisierung vom Rendern entkoppelt und haben die genaue Kontrolle darüber.

In diesem Szenario kann Ihre Spieleschleife auf einem Computer mit beispielsweise 60 fps und auf einem anderen Computer mit 45 fps oder etwas anderem ausgeführt werden. Ihre Simulation wird jedoch immer mit der genau festgelegten Geschwindigkeit zwischen ihnen ausgeführt.

Ihr Spiel ist jetzt in zwei Abschnitte unterteilt, einen zum Rendern Ihrer Grafiken und einen zum Aktualisieren Ihrer Simulation. Sie stellen Ihre gewünschte Simulationsrate zu Beginn des Spiels ein und erhalten oben in Ihrer Spielschleife die verstrichene Zeit. Beachten Sie, dass diese verstrichene Zeit eine Zeitgröße ist, die auf Ihrer gewünschten Simulationsrate basiert. Dieser Wert wird dann als Multiplikator für Ihre Spielobjekte verwendet, um sie auf / oder sehr nahe an Ihrer gewünschten Simulationsrate zu halten. Wenn Sie beispielsweise möchten, dass Ihre Simulation mit 30 fps aktualisiert wird und Ihre Spieleschleife derzeit mit 60 fps ausgeführt wird, beträgt der Wert für die verstrichene Zeit für diesen Frame 0,5. Wenn Sie dies mit der Geschwindigkeit Ihrer sich bewegenden Objekte multiplizieren, bewegen sie sich mit 30 fps. Wissen Sie, dass die Geschwindigkeit Ihrer Spielschleife von Bild zu Bild stark variiert und das Timing der Frame-Basis Ihre Simulation mit einer bekannten und vorhersehbaren Geschwindigkeit laufen lassen kann.

Das Ergebnis ist eine seidenweiche Animation.


1
-1 Dies sind nur Aktualisierungen in festen Schritten (wie in meiner Antwort und in AttackingHobos erläutert), mit Ausnahme von Dingen mit einer Rate pro Frame und nicht mit einer intuitiven Messung wie pro Sekunde. Wenn Sie so weit gehen, ist dies nur ein kleiner Schritt, um die Dinge pro Sekunde zu erledigen und sich die unintuitive mentale Arithmetik zu ersparen, die zwischen Geschwindigkeiten pro Sekunde und Geschwindigkeit pro Bild übersetzt (und alles viel einfacher macht, wenn Sie ändern zufällig Ihre Bildrate.
Doppelgreener
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.