Große FPS gegen konsistente FPS

8

Wann sollte ich mich bei der Optimierung der Framerate eines Spiels auf eine große FPS und wann auf eine konsistente Framerate konzentrieren?

Dies ist oft ein heiß umkämpftes Thema. Bitte beachten Sie, dass ich nicht frage, welches besser ist.

Was sind die Vor- und Nachteile von jedem?
In welchen Situationen wird einer dem anderen vorgezogen?

Beachten Sie auch: Meine Eingabe- / Verarbeitungs-, Physik- und Spielaktualisierungsraten sind unabhängig von meiner Bildrate. Das einzige, was der FPS beeinflusst, ist, wie oft ein Bildschirm gerendert wird.

deft_code
quelle

Antworten:

10

Das ist natürlich subjektiv, aber ich denke, dass Konsistenz für das Spiel viel wichtiger ist als Geschwindigkeit.

Grundsätzlich werden die Spieler eine langsamere Framerate in Kauf nehmen, wenn das Spiel konsistent ist, Spaß macht und nicht jarrt. Aber selbst wenn das Spiel total rockt, wenn es den Leuten Kopfschmerzen bereitet, weil es platzt und / oder sie die Dinge nicht kontrollieren können, werden sie verärgert und hören auf zu spielen.

Damit...

Konzentrieren Sie sich während des gesamten Designs und der Entwicklung auf konsistente FPS.

Konzentrieren Sie sich auf schnellere (aber immer noch konsistente) FPS, wenn das Spiel fast fertig ist und Sie Zeit haben, die Leistung zu verbessern, ohne sich um Fehlerkorrekturen usw. kümmern zu müssen.

Eine Möglichkeit, eine bessere Leistung zu erzielen, besteht darin, Rückrufe / Delegaten / Interrupts (abhängig von Ihrer Sprache / Plattform) anstelle von Abfragen zu verwenden.

Olie
quelle
9
Ein weiterer kurzer Hinweis: Programmieren Sie Objektgeschwindigkeiten in "... pro Sekunde", nicht in "... pro Frame". Selbst wenn Sie nahezu gleichmäßige FPS erhalten, gibt es einige Abweichungen, und das Verschieben eines Objekts "10 'pro Sekunde" funktioniert besser als "0,1' pro Frame" (unter der Annahme von 100 FPS), da die 10 '/ s sogar korrekt sind wenn die Frame-Zeit etwas abweicht.
Olie
13

Was du machen solltest:

  • Sperren Sie die Spielelogik auf eine feste Framerate
  • Rendern Sie Grafiken so schnell wie möglich

Auf diese Weise wird das Spiel nicht unspielbar, wenn die Framerate sinkt und Sie keine Eingangsverzögerung erhalten (ich sehe Sie an, nur Ursache 2), und wenn die Framerate zu hoch wird (denken Sie an Spiele aus den 90ern).

So mache ich das:

s_PhysicsCurrent = GetTickCount();
float delta = (float)(s_PhysicsCurrent - s_PhysicsStart);
s_PhysicsStart = s_PhysicsCurrent;

s_PhysicsTime += delta;

while (s_PhysicsTime > ONEFRAME)
{
    // Update
    Game::Tick(ONEFRAME);

    // Clear input
    Keyboard::Clear();
    Mouse::Clear();

    s_PhysicsTime -= ONEFRAME;
}

s_Window->Clear();

Game::Render();

s_Window->Swap();

Sie sammeln im Grunde genommen einen "Stapel" von Frames, für die Logik erstellt werden soll, und Sie können perfekt zwischen ihnen interpolieren.

Ritter666
quelle
2

Es hört sich so an, als hätten Sie mindestens zwei Ausführungsthreads, wobei Ihr Rendering auf einem eigenen Thread erfolgt. Wenn dies der Fall ist, müssen Sie sich tatsächlich um zwei Bildraten sorgen. Sie möchten, dass beide so schnell wie möglich sind. Dies hängt jedoch auch von der Art des Spiels ab, das Sie erstellen.

Bauen Sie einen Ego-Shooter, bei dem kleine Einbußen bei der Framerate einem Gegner einen Vorteil verschaffen könnten? Wenn ja, sollten Sie sicherstellen, dass Ihre durchschnittlichen fps hoch genug sind, sich aber auch um Ihre Worst-Case-Frame-Zeiten sorgen. Bauen Sie ein Brettspiel? Wenn dies der Fall ist, wird der gelegentliche Anstieg der Frame-Zeit die Benutzererfahrung nicht beeinträchtigen.

In meinen eigenen Spielen ist mein Prozess normalerweise ungefähr so:

  • Führen Sie einen Profiler für den Code aus
  • Sehen Sie sich die durchschnittliche Bildrate an. Wenn es im Durchschnitt zu niedrig ist, erhöhen Sie die durchschnittlichen FPS, indem Sie das langsame Material optimieren.
  • Wenn die durchschnittlichen fps hoch genug sind, suchen Sie nach Worst-Case-Frame-Zeiten (Frames, bei denen Sie große Spitzen in der Rechen- oder Renderzeit sehen). Versuchen Sie, diese Worst-Case-Szenarien zu optimieren, um die Worst-Case-Frame-Zeit zu verbessern.

Wenn Sie die meiste Zeit mit 30 fps arbeiten, aber alle 10 Sekunden einen Spitzenwert von 200 ms erreichen, führt dies zu Problemen. Wenn Sie jedoch durchschnittlich 15 fps erzielen, erhöhen Sie zuerst Ihre durchschnittlichen fps.

Die kurze Antwort wäre also wahrscheinlich: Optimieren Sie zuerst, was die Benutzererfahrung am meisten verbessert.

OTrain13
quelle
2

Durch Sperren Ihres FPS auf eine konsistente Nummer können Sie:

  • Sorgen Sie für ein glattes Erscheinungsbild
  • Lassen Sie Animationen in linearer Zeit laufen, Physikobjekte fallen mit einer konstanten Geschwindigkeit zwischen Frames usw.
  • Der nützlichste Teil beim Sperren Ihres FPS ist jedoch, dass Sie in Frames, in denen Sie einige Ausfallzeiten haben, andere Arbeiten ausführen können - Müll sammeln, im nächsten Bereich der Karte streamen usw. und beim Rendern etwas Headroom haben etwas Großes und Glänzendes oder wenn man einen Stapel Kisten umwirft.
Sean James
quelle
+1: obwohl ich mit deiner zweiten Kugel nicht einverstanden bin. Ein fallender Block braucht nur 1 Sekunde, um den Bildschirm zu überqueren, egal ob er 6 Mal oder 60 Mal gezeichnet wird.
deft_code
2
Richtig, ich meinte, dass wie in der Box aufgrund der unterschiedlichen Zeit zwischen den Ziehungen nicht von einer Position zur anderen zu springen scheint. Eine gleichmäßige Bewegung ist sporadischen Bewegungen vorzuziehen, die durch einen variablen Zeitschritt verursacht werden.
Sean James
1

Beide. Ich würde idealerweise konstant über 60 Bilder pro Sekunde sagen. Realistisch konsistent über 30 Bilder pro Sekunde. Unter 30 Bildern pro Sekunde wirkt sich dies auf die Leistung des Spielers aus (ich denke übrigens an FPS / Twitch-basierte Spiele, Strategiespiele können wahrscheinlich niedriger auskommen).

Wenn Sie wirklich das eine oder andere sagen müssten, würde ich konsequent vorgehen. Wenn Sie eine Bildrate garantieren können, können Sie sich darauf konzentrieren, die garantierte Bildrate höher zu setzen.

Zwergner
quelle
1

Größer ist immer besser, aber:

Eine inkonsistente Framerate kann zu Reisekrankheit führen.

(Wir hatten einen internen Tester übergeben, als seine Framerate 10 Sekunden lang zwischen 20 und 60 sprang.)

Andreas
quelle
3
Sind Sie sicher, dass der Tester nicht verkatert war?
Sam Harwell
0

Ich würde denken, Sie würden sowohl eine konsistente als auch eine größere FPS wollen. Je flüssiger die Grafik (aufgrund der Bildwiederholfrequenz), desto besser. Wenn es unter 30 FPS fällt, werden Ihre Benutzer die Nervosität bemerken und frustriert sein, wenn die Reaktionszeit auf Aktionen fehlt.

Bryan Denny
quelle
0

Wenn Sie ein Zerreißen verhindern möchten , sollten Sie V-Sync verwenden, um die FPS an die Bildwiederholfrequenz des Monitors oder niedriger zu binden (wenn Sie höher gehen, wird es nicht sichtbar, es wäre also eine Verschwendung).

Bart van Heukelom
quelle
-4

Es gibt nur eine Antwort, und das ist ... während der Entwicklung immer hoch hinaus und wenn Sie es auf die niedrigste Spitze bringen, wird dies das Spiel in einen kranken, stetigen Fluss bringen. Ich sitze auf dem Code und er wird dort bleiben, weil es meine geheime Art des Codierungsdrachen ist. / Eyhe

Eyeh
quelle
Warum? Was ist die "niedrigste Spitze"?
Anko
3
-1 Dies ist keine Antwort. Es ist eine Art Vogon-Poesie.
MichaelHouse