Frameratenbegrenzung

9

Die erfolgreichsten Wettbewerb Game - Engines wie id Tech, GoldSrc, Sourceund so ermöglicht Framerate Einschränkungen.

Sie können mit 30, mit 60, mit 99, mit 72, mit 68 usw. spielen. Kurz gesagt, Sie können es begrenzen und die Kappe steuern.

Ich habe mich gefragt, wie ich die Framerate begrenzen kann.

Nicht an Code interessiert, sondern an Theorie.

Ruckmodus
quelle
Was bringt es aus Neugier, Zyklen für andere Prozesse freizugeben?
3Dave
1
@DavidLively, Denken Sie an Laptops, die bei einer sehr hohen Bildrate sehr leicht überhitzen, während sie mit einer Obergrenze von 60 fps (mehr ist sowieso nutzlos, sogar 60 ist ein bisschen viel, 40 sollten tun) die Temperatur viel besser steuern können.
Für wettbewerbsfähige Spiele ist es am besten, eine gleichmäßige Bildrate anstelle von Spitzen zwischen 60 und 100 fps zu haben, da einige Aktionen manchmal von der Bildrate und nicht von der Zeit abhängen. Bei gleicher Bildrate können Sie ein Gefühl für diese Aktionen bekommen. Übrigens, wenn Sie VSync aktivieren, hat Ihr Spiel immer eine maximale fps, die Ihrer Aktualisierungsrate entspricht, weil (der Treiber kümmert sich darum).
Roy T.
gafferongames.com/game-physics/fix-your-timestep
Prof. Falken Vertrag verletzt

Antworten:

7

Die Theorie lautet: Überprüfen Sie, wann Sie das letzte Mal einen Frame gerendert haben und ob es noch nicht an der Zeit ist, einen weiteren Frame zu zeichnen.

Kylotan
quelle
8

Angenommen, Sie möchten Ihre Framerate auf 60 fps beschränken. Dies bedeutet, dass jeder Frame eine Renderzeit von 1 / 60s = 16,67 ms (gerundet) hat.

Um Ihre Framerate zu begrenzen, überprüfen Sie einfach die Zeit zu Beginn Ihrer Spielschleife und können sie dann mit der Zeit am Ende der Spielschleife vergleichen: Wenn die Differenz weniger als 16,67 ms beträgt, sollten Sie für diese Zeit stehen bleiben.

Eine Möglichkeit, dies zu tun, besteht darin, Folgendes zu verwenden:

sleep(waittime)

Da sleep(x)der Thread jedoch für ein Minimum von xMillisekunden ausgegeben wird, wissen Sie nicht sicher, ob Sie die Kontrolle in der Zeit zurückerhalten werden.

Ein besserer Weg wäre zu verwenden:

while(timediff < 16.67ms){ sleep(0); }

Dies gibt den Thread zurück und fordert die Kontrolle so schnell wie möglich zurück.

Eine andere Lösung besteht darin, nur eine ausgelastete Warteschleife zu haben. Dies gibt Ihnen die beste Kontrolle, nutzt aber die CPU unnötig.

Denken Sie daran, dass der OS-Scheduler Ihrem Thread jederzeit die Kontrolle entziehen kann. Seien Sie also auf Schwankungen vorbereitet.

Roy T.
quelle
"1 / 60s" um klar zu sein. :)
Richard Marskell - Drackir
Diese Lösung ist wirklich schlecht. Wenn Sie vsync aktiviert haben oder das Betriebssystem sich dazu entscheidet, schwankt Ihre Framerate stark.
Tara
@ Dudeson Warum ist es schlecht? (Dies ist übrigens die in Quake3 verwendete Technik). Wenn Ihr FPS niedriger als 60 ist, wird die Schleife einfach übersprungen. So hält es Ihre FPS so hoch wie möglich, aber nie über 60.
Roy T.
@ RoyT. Interessant ... Woher hast du diese Informationen? Aus dem Quellcode? Außerdem sage ich, dass das Warten in einer Schleife schlecht ist, weil ich es genau so in meinem Motor gemacht habe und es mir große Schmerzen bereitet. Das Problem ist, dass beim Aktivieren von vsync (im GPU-Treiber) viele Frame-Drops auftreten, wenn Sie zusätzlich versuchen, die Framerate in Ihrem Code zu begrenzen, da Ihr Timinig nicht bei jedem Frame perfekt ist. Ich spreche nur über vsync Probleme. Ohne vsync ist dies kein Problem. Und ich bin mir nicht sicher, ob vsync in den drei Tagen von Quake das gleiche Geschäft war wie heute.
Tara
@Dudeson jemand anderes hat mich vor einiger Zeit darauf hingewiesen, weil ich mir Sorgen um das geschäftige Warten und Schlafen gemacht habe. Ich sehe jetzt, dass Sie zwischen 30 fps und 60 fps schwanken können, wenn die V-Synchronisierung aktiviert ist, wenn Sie sie leicht verpassen. Aber ich denke, das passiert mit jeder Technik (ist es nicht das, was FreeSync zu lindern versucht). Eine begrenzte Framerate durch Code oder weil Ihr Computer nicht mit 60fps rendern kann, wird immer dieses Problem haben, denke ich :)
Roy T.