Was bringt es, Bilder pro Sekunde zu begrenzen? (Wenn überhaupt)


13

Ich arbeite an einem einfachen Spiel in OpenGL, bei dem SDL für die Initialisierung und Eingabe der Anzeige verwendet wird, und es wird in Bezug auf das Timing angezeigt, für das ich zwei Optionen zur Verfügung habe. Die Nummer eins, die gerade für das optimale TimePerFrame schläft - theTimeTakenToRender, wenn das optimale TimePerFrame in Sekunden = 1 / theFramerateCap. (Ich bin mir nicht ganz sicher, ob dies erforderlich ist, da dies der Verwendung von vsync entspricht, was möglicherweise genauer ist. Wenn meine Annahme korrekt ist, teilen Sie mir bitte mit, ob SDL + OpenGL standardmäßig vsync verwendet, und wenn nicht, wie um es zu aktivieren.) Die andere besteht darin, die Zeit seit dem Rendern des letzten Frames zu messen und lediglich die Bewegung entsprechend anzupassen. (Je kürzer das Rendern eines Frames ist, desto weniger Objekte bewegen sich in diesem Frame.) Was sind die Vor- und Nachteile dieser beiden Methoden in Bezug auf die Leistung, die Verringerung des Flimmerns usw.?

Antworten:


15

Wenn Ihre Rahmenzeit ist unberechenbar (ob dies deine Schuld, die OS - Ressourcen gelegentlich dargestellt werden kann, usw.), zu einer vorhersagbaren Bildrate Capping , das etwas ist , als Ihre erreichbare Bildfrequenz senken wird viel für vorhersehbare tun Latenz , die Dose Das Spiel fühlt sich viel besser an.

Das Ändern der Zeitspanne zwischen der Verarbeitung von Eingaben und dem Rendern von Änderungen in Bezug auf diese Eingaben kann sich schlecht anfühlen. Auch wenn Sie durchschnittlich eine geringere Latenz zwischen den beiden erzielen , kann der "Jitter" für den Menschen (bewusst oder unbewusst) spürbar sein.

Weitere Informationen finden Sie in der Microsoft GameFest-Präsentation " Was ist in einem Frame?" . Carmack hat auch eine Reihe von Blog-Posts , die dazu nützlich sind.

Beachten Sie auch, dass einige Berechnungen ausfallen können, wenn Sie Frames mit niedrigen deltaTWerten ausführen - oder sogar, wenn Sie Variablen verwenden deltaT(es kann schwieriger oder sogar schwierig werden, dies auf "stabile" und vorhersehbare Weise zu tun, was für die Dinge wichtig ist wie Wiederholungen und einige Formen der Netzwerksynchronisation). Weitere Informationen finden Sie hier unter Fix Your Timestep .


1
(Übrigens, ich würde dringend empfehlen, nicht auf "Ruhezustand" zu verzichten. Finden Sie heraus, wie sich Ihre vsync-Situation auf Ihrer Plattform verhält, und verwenden Sie vsync, um Sie zu steuern. Es ist viel vorhersehbarer und verbraucht normalerweise weniger Ressourcen.)
Leander

Danke, ich werde auf jeden Fall versuchen, die Framerate zu begrenzen. Wissen Sie, wie Sie vsync mit SDL aktivieren können?
w4etwetewtwet

1
In SDL 2.0 können Sie vsync aktivieren, indem Sie das Flag SDL_RENDERER_PRESENTVSYNC an den SDL_CreateRenderer-Aufruf übergeben, z. B.SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS,

12

Sie werden am Ende viel weniger CPU verbrauchen (Multi-Tasker werden es Ihnen danken), und auch Leute auf Mobilgeräten werden dies zu schätzen wissen.


4
Ganz zu schweigen von einem geringeren Stromverbrauch (wichtig für mobile Geräte / Laptops) und einer geringeren Wärmeentwicklung.
Zeel

Es erinnert mich an ein Spielproblem, bei dem die FPS in den Menüs unbegrenzt und wahnsinnig hoch waren, ähnlich wie bei 900 fps, und das die CPU / GPU -> höhere Temperatur -> mehr Rauschen wirklich belastete.
Kromster sagt Unterstützung Monica

10

Sie sollten niemals, niemals, niemals, niemals Sleep verwenden, um die Framerate zu kontrollieren .

Dies wurde bereits zuvor besprochen und ich verweise Sie auf die andere Frage, um die Gründe dafür zu erörtern. Eine Sache, die dort nicht erwähnt wird, ist, dass es bei der typischen modernen Bildwiederholfrequenz von 60 Hz und der typischen 1-Millisekunden-Granularität von Sleep-Aufrufen unmöglich ist, für die richtige Zeitspanne zwischen Frames zu schlafen.

Ich sage nicht , dass es eine schlechte Sache ist, CPU abzugeben, wenn Sie nichts zu tun haben. weit davon entfernt. Aber es ist nicht dasselbe wie die Einstellung der Framerate und Sleep ist eine Lösung, die für die erstere, aber nicht für die letztere geeignet ist.

Überprüfen Sie stattdessen, ob Zeit verstrichen ist. Wenn Sie einen Frame ausführen möchten, müssen Sie dies tun. Andernfalls - und wenn Sie etwas CPU-Leistung erzielen möchten - müssen Sie eine Millisekunde lang in den Energiesparmodus wechseln. Stellen Sie außerdem sicher, dass Ihr Sleep-Timer für Ihre Plattform geeignet eingestellt ist, um eine gute Auflösung zu erzielen. Das heißt, wenn Sie den Aufruf "Sleep (1)" ausgeben, haben Sie tatsächlich die Chance, 1 Millisekunde lang wirklich zu schlafen, anstatt etwa 15, 20 oder 30 (was sonst der Fall wäre). Ich glaube, dass SDL dies automatisch für Sie erledigt.

Sie können auch ein wenig nachlassen, sodass Sie den Ruhezustand beenden und sofort loslegen, bis der Frame ausgeführt wird, damit Sie das gewünschte Frame-Intervall genauer treffen können, wenn es fast Zeit ist, einen Frame auszuführen.

Das Ergebnis ist eine ganze Reihe von Sleep (1) -Anrufen, die mit gelegentlichen Frames durchsetzt sind, und das ist in Ordnung. Sie geben die CPU immer noch auf, wenn Sie sie nicht benötigen, aber Ihre Frames können immer noch pünktlich ausgeführt werden.



0

Wie bereits erwähnt, wird die CPU-Auslastung gesenkt. Auf der anderen Seite und immer wichtiger, dass auch die Batterielebensdauer erschöpft. Zum Beispiel läuft FTL auf meinem MBA zu fast 100% mit CPU. Dadurch wird der Akku in> 2 Stunden entladen und läuft sehr heiß. (Als direkteres Ergebnis habe ich es deinstalliert und nicht mehr abgespielt ...). Eine Rahmenkappe hätte dies verhindert.

Ein weiterer, nicht erwähnter Vorteil ist, dass Sie, wenn es sich um ein Multiplayer-Spiel handelt, auch das Spielfeld ausgleichen, indem Sie allen das gleiche Erlebnis bieten.


Die Framerate und die Spielaktualisierungsschleife müssen nicht mit der gleichen Geschwindigkeit ausgeführt werden. Wenn Sie also Menschen die gleiche Erfahrung bieten, hängt dies nicht nur von der Framerate ab.
Thomas
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.