UPS und FPS - Was soll ich einschränken und warum?

11

Ich schreibe gerade ein Spiel mit C ++ und SDL2 und es gibt eine Sache, über die ich mich wundere - ist es sinnvoll, meine Frames pro Sekunde (FPS) und / oder meine Updates pro Sekunde (UPS) zu begrenzen?

Ich habe die Idee, dass Sie, wenn Sie die USV begrenzen, im Wesentlichen die Geschwindigkeit des Spiels steuern. Wenn sich der Spieler 1 Update pro Update bewegt und Sie es immer 30 Mal pro Sekunde aktualisieren, bewegt er sich mit einer Geschwindigkeit von 30 Pixel / s und Sie Wahrscheinlich wird auch die CPU entlastet, da die Anzahl der Berechnungen pro Sekunde abnimmt. Wenn Sie die FPS begrenzen, verringert sich die Anzahl der Drawcalls pro Sekunde, sodass Sie Ihre GPU entlasten. Ich hoffe, ich habe das alles richtig verstanden, wenn nicht, können Sie mich gerne korrigieren.

Meine Frage ist - was soll ich in meinem Spiel einschränken? FPS? UPS? Beide? Weder? Gibt es einen anderen, besseren Ansatz dafür? Wie wird das in den meisten Spielen gemacht und warum?

Antworten werden sehr geschätzt!

DocCoock
quelle
2
Nicht wirklich eine Antwort, aber Sie könnten dies nützlich finden: gafferongames.com/game-physics/fix-your-timestep
Cypher

Antworten:

10

Ja, das macht Sinn.

Wie Sie sagten, wird das System weniger belastet, was für die Thermik und andere Anwendungen gut ist.

Allerdings ... Ihre Spielelogik sollte NICHT von den Updates pro Sekunde abhängen. Daher empfehle ich Ihnen, einen Blick auf die Deltatime zu werfen, um Ihr Spiel unabhängig von den Updates pro Sekunde zu machen.

Ich empfehle Ihnen, sich diese Frage anzuschauen. Es erklärt ziemlich gut, wie man es berechnet und verwendet. So erhalten und verwenden Sie die Deltazeit

Hoffe es hat geholfen!

KaareZ
quelle
Soll ich also beide oder nur einen einschränken?
DocCoock
Beides, aber fügen Sie in den Einstellungen eine Option zum Anpassen hinzu.
KaareZ
5
Ein Wort der Vorsicht: Wenn Sie eine Physik-Engine verwenden, verlassen Sie sich nicht auf den Delta-Zeit- / Variablen-Aktualisierungsrahmen, da diese selten unterstützt werden. Sie erfordern den Ansatz mit festem Rahmen. Und wenn Ihr Frame stark schwankt, kann dies bedeuten, dass Sie Probleme mit Ihrer Software haben und sich fragen sollten, warum dies passiert. In Anbetracht dessen könnten Sie die Verwendung des DT-Ansatzes überdenken.
Vaillancourt
1
Beachten Sie, dass die Verwendung von Updates basierend auf der Delta-Zeit zu Instabilität der Physik und Fehlern führen kann, die sehr schwer zu reproduzieren sind. In einigen Spielen gibt es Tricks, die nur bei bestimmten Bildraten möglich sind. Aus diesem Grund läuft die Physik häufig mit einer festen Bildrate. Sie können immer mit niedrigeren Aktualisierungsraten interpolieren, aber wenn Ihre Simulation instabil ist, kann Ihnen nichts helfen.
Dietrich Epp
1
Ehrlich gesagt denke ich, dass Deltatime keine gute Idee ist. Ich habe es jahrelang benutzt und es kommt mit zwei Hauptproblemen. In vielen verschiedenen Multiplayer-Artikeln wird empfohlen, feste Zeitschritte zu verwenden. Wenn die Deltatime zu hoch ist, können Sie sich durch Wände oder ähnliche Fehler teleportieren, sofern Sie dies nicht berücksichtigen.
Programmdude
6

Die beste Antwort ist: Es kommt darauf an .

Sie müssen keine einschränken

Updates : Wenn Ihre Updates nicht an eine Obergrenze gebunden sind, sollte die Spielelogik von einem Delta- Zeitbetrag abhängen , um zu vermeiden, dass das Spiel je nach Computer, auf dem es ausgeführt wird, schneller oder langsamer ausgeführt wird. Dies ist ein sehr verbreiteter Ansatz, der von vielen Spielen verwendet wird, aber nicht der einzige.

Rendern : Wenn das Rendern nicht an eine Obergrenze gebunden ist, wird der Framebuffer möglicherweise in einem unvollständigen oder fehlerhaften Zustand dargestellt, was zu Zerreißartefakten führt . Aus diesem Grund verwenden viele Spiele die vertikale Synchronisation (V-Sync).

Sie können beide einschränken

Updates : Einige Spiele verwenden feste Zeitschritte für einige oder alle Gameplay-Systeme. Dieser Ansatz funktioniert genau so, wie Sie es beschrieben haben. Die Anzahl der Updates pro Sekunde ist auf eine Obergrenze begrenzt, um sicherzustellen, dass sich die Dinge auf einem erstklassigen Computer nicht zu schnell bewegen. Dadurch entfällt die Notwendigkeit eines Delta-Timings. Einige Anwendungen sind mit festen Zeitschritten besser, andere mit Delta-Timing. Die Wahl des Ansatzes hängt ganz davon ab, was genau Sie erreichen möchten. Das Online - Buch GameProgrammingPatterns hat ein eigenes Kapitel gewidmet Spiel Schleifen , dass Berührungen auf beiden Architekturen.

Rendern : Frames Per Second sollten auf eine Obergrenze eingestellt werden, um das oben erwähnte Rissproblem zu vermeiden. Ihre Anwendung sollte dies jedoch nicht manuell mit einer CPU-Sperre versuchen. Aktivieren Sie stattdessen die V-Synchronisierung und lassen Sie die zugrunde liegende Hardware mit der Aktualisierungsrate des Monitors synchronisieren. Auf diese Weise ist Ihr Spiel vorwärtskompatibel mit zukünftigen Monitoren, die möglicherweise auf einer viel höheren Frequenz als den derzeit üblichen 60 Hz arbeiten. Es ist auch erwähnenswert, dass viele Spieler, insbesondere diejenigen, die sich mit Benchmarking beschäftigen, es immer noch vorziehen, ohne V-Sync zu laufen, um die höchstmögliche Bildrate zu ermöglichen. Es ist daher sinnvoll, die Funktion zur Laufzeit zu aktivieren oder zu deaktivieren.

Was Sie nicht einschränken sollten

Wenn Ihr Spiel einen auf Abfragen basierenden Ansatz für Benutzereingaben verwendet, z. B.: Ruft eine getInput()Art auf, um die Controller-Zustände während des Aktualisierungsschritts zu aktualisieren, ist dies besser, wenn nicht eingeschränkt. Oder wenn begrenzt, dann auf eine sehr hohe Obergrenze setzen. Je öfter Sie Benutzereingaben abfragen und darauf reagieren, desto reaktionsschneller und flüssiger wird sich das Spiel "anfühlen". Die sogenannten 60-Hz-Spiele, von denen wir heutzutage hören, aktualisieren nicht die KI und alle Weltzustände mit dieser Geschwindigkeit, einige rendern nicht einmal so schnell, aber sie fragen die Controller-Eingabe mindestens 60 Mal pro Sekunde ab und aktualisieren den Spieler-Avatar entsprechend. Zugegeben, dies ist nur für schnelllebige Actionspiele wirklich relevant.

glampert
quelle
Meine Updates werden jedoch auch automatisch eingeschränkt, wenn VSync aktiviert ist. Daher muss ich mich anscheinend zwischen dem Rissproblem und dem Update-Polling-Problem entscheiden, richtig?
DocCoock
@DocCoock: Wenn Ihr Renderer und Ihre Spielelogik auf demselben Thread ausgeführt werden, wird durch das Aktivieren von V-Sync auch die Aktualisierungshäufigkeit festgelegt. Dies ist einer der Gründe, warum einige Spiele Rendering und Spielelogik in verschiedene Threads trennen.
Glampert
1

Es gibt zwei Beiträge, die Sie sich ansehen möchten:

Korrigieren Sie Ihren Zeitschritt

Interpoliertes Physik-Rendering

Ich finde die Diskussionen auf den Posts wirklich von unschätzbarem Wert, aber meiner Meinung nach ist es am sinnvollsten, wenn das Spiel eine wichtige Menge an Physiksimulation enthält. Zusammenfassend ist die Idee, dass die Simulation einen festen Zeitschritt haben sollte (andernfalls könnte die Physik an einem Punkt explodieren, an dem das Delta zu groß ist), während dem Rendern die Freiheit gegeben werden sollte, mit der maximal möglichen Geschwindigkeit zu laufen. Um beide zu synchronisieren (die Simulation und das Rendern), wird der Renderstatus durch einen Faktor interpoliert, der davon abhängt, wie weit die Simulation von der folgenden Aktualisierung entfernt ist (denken Sie daran, dass die Simulation behoben ist).

Ich hoffe es hilft.

Francis Moy
quelle