, das den FPS-Grenzwert in der OpenGL-Anwendung steuert

8

Ich versuche eine solide Methode zu finden, um genau festzulegen, wie viele FPS meine OpenGL-Anwendung auf dem Bildschirm rendern soll. Ich kann es bis zu einem gewissen Grad schaffen, indem ich für 1000 / fps Millisekunden ausschließe, aber das berücksichtigt nicht die Zeit, die zum Rendern benötigt wird. Welches ist der bestmögliche Weg, um fps auf den gewünschten Betrag zu begrenzen?

    
Tsaras 19.02.2013, 22:32
quelle

7 Antworten

7

Sie können mit vblank mit wglSwapIntervalEXT in opengl synchronisieren. Es ist nicht schön Code, aber es funktioniert.

Ссылка

%Vor%

und

%Vor%     
bizzehdee 19.02.2013 22:39
quelle
5

Da OpenGL nur eine Low-Level-Grafik-API ist, werden Sie nichts dergleichen direkt in OpenGL eingebaut finden.

Aber ich denke, Ihre Logik ist ein bisschen fehlerhaft. Anstatt wie folgt:

  1. Rahmen zeichnen
  2. Warte 1000 / fps Millisekunden
  3. Wiederholen Sie

Sie sollten das tun:

  1. Starten Sie den Timer
  2. Rahmen zeichnen
  3. Stoppuhr
  4. Warte (1000 / fps - (Stopp - Start)) Millisekunden
  5. Wiederholen Sie

Auf diese Weise, wenn Sie nur genau die Menge warten, die Sie sein sollten, und Sie sollten sehr nah an 60 (oder was auch immer Sie anstreben) Bilder pro Sekunde beenden.

    
Andrew Rasmussen 19.02.2013 22:41
quelle
4

OpenGL selbst hat keine Funktionalität, die die Framerate begrenzt. Zeitraum.

Auf modernen GPUs gibt es jedoch eine Menge Funktionen, die Framerate, Frame-Prädiktion usw. abdecken. Es gab John Carmacks Problem, dass er dazu drängte, einige Funktionen dafür verfügbar zu machen. Und da ist NVidias adaptive Synchronisation.

Was bedeutet das für dich? Überlasse das GPU. Nehmen Sie an, dass Zeichnen völlig unvorhersehbar ist (wie Sie sollten, wenn Sie nur OpenGL beachten), messen Sie die Ereignisse selbst und halten Sie die Logikaktualisierungen (z. B. Physik) vom Zeichnen getrennt. Auf diese Weise können Benutzer von all diesen fortschrittlichen Technologien profitieren und Sie müssen sich darüber keine Gedanken mehr machen.

    
Bartek Banachewicz 23.10.2013 12:29
quelle
2

Benutze keinen Schlaf. Wenn Sie dies tun, muss der Rest Ihrer Anwendung darauf warten, dass sie beendet werden.

Behalten Sie stattdessen den Überblick darüber, wie viel Zeit vergangen ist, und rendern Sie nur, wenn 1000 / fps erreicht wurden. Wenn der Timer nicht erreicht wurde, überspringen Sie ihn und machen Sie andere Dinge.

In einer Single-Thread-Umgebung wird es schwierig sein, sicherzustellen, dass Sie genau 1000 / fps zeichnen, es sei denn, dies ist absolut das einzige, was Sie tun. Ein allgemeinerer und robusterer Weg wäre, das gesamte Rendering in einem separaten Thread auszuführen und diesen Thread mit einem Timer zu starten / auszuführen. Das ist ein viel komplexeres Problem, aber Sie werden dem, wonach Sie fragen, am nächsten kommen.

Auch das Nachverfolgen, wie lange es dauert, um das Rendering zu erstellen, würde helfen, sich im laufenden Betrieb anzupassen, wenn Dinge gerendert werden.

%Vor%     
tamato 30.10.2013 03:12
quelle
1

Setzen Sie dies nach dem Zeichnen und dem Aufruf von Swap-Puffern:

%Vor%

Wenn Sie 60 fps wünschen, minFrameTime = 1.0/60.0 (vorausgesetzt, die Zeit ist in Sekunden).

Dies wird Ihnen keine vsync geben, aber bedeutet, dass Ihre App nicht außer Kontrolle gerät, was die Physikberechnungen (wenn sie nicht fixed-step sind), Animationen usw. beeinflussen kann. Denken Sie nur daran, Eingabe verarbeiten nach dem Schlaf ! Ich habe mit dem Versuch experimentiert, die Frame-Zeiten zu mitteln, aber das hat bisher am besten funktioniert.

Für getElapsedTimeOfChoice() verwende ich, was hier hier erwähnt wird, was

ist
jozxyqk 30.10.2013 09:02
quelle
0

Eine andere Idee ist die Verwendung von WaitableTimers (wenn möglich, zum Beispiel unter Windows)

Grundidee:

%Vor%

Weitere Informationen: Wie Sie fps-Informationen begrenzen

    
fen 24.03.2014 20:05
quelle
0

Eine einfache Möglichkeit ist die Verwendung von GLUT. Dieser Code kann die Aufgabe grob erfüllen.

%Vor%     
Eliko 23.02.2015 10:37
quelle

Tags und Links