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.?
quelle
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
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.
quelle
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.
quelle
Der wahrscheinlich wichtigste Vorteil der Begrenzung der Bildrate besteht darin, dass buchstäblich physische Schäden an der Maschine vermieden werden können. Sie haben vergessen, dies auf Starcraft II zu tun, was sich für einige Benutzer als sehr problematisch (und teuer) herausstellte, bis sie es gepatcht haben.
quelle
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.
quelle