Gibt es eine Möglichkeit zu berechnen, wie viele Aktualisierungen vorgenommen werden sollten, um die gewünschte Bildrate zu erreichen, NICHT systemspezifisch? Ich habe das für Windows gefunden, aber ich würde gerne wissen, ob sowas in openGL selbst existiert. Es sollte eine Art Timer sein.
Oder wie kann ich sonst verhindern, dass FPS dramatisch abfällt oder ansteigt? Für diese Zeit teste ich es beim Zeichnen einer großen Anzahl von Scheitelpunkten in einer Linie, und bei der Verwendung von Fraps kann ich eine Bildrate von 400 bis 200 fps sehen, wobei sich das Zeichnen offensichtlich verlangsamt.
Sie haben zwei verschiedene Möglichkeiten, dieses Problem zu lösen:
Angenommen, Sie haben eine Variable mit dem Namen maximum_fps
, die die maximale Anzahl von Bildern enthält, die Sie anzeigen möchten.
Dann messen Sie die Zeit, die Sie für das letzte Bild aufgewendet haben (ein Timer genügt)
Nehmen Sie jetzt an, Sie haben gesagt, dass Sie maximal 60 FPS für Ihre Anwendung benötigen. Dann möchten Sie, dass die gemessene Zeit nicht weniger als 1/60 ist. Wenn die gemessene Zeit niedriger ist, rufen Sie sleep()
auf, um die für einen Rahmen verbleibende Zeit zu erreichen.
Oder Sie können eine Variable namens tick
haben, die die aktuelle "Spielzeit" der Anwendung enthält. Mit demselben Timer werden Sie ihn bei jeder Hauptschleife Ihrer Anwendung erhöhen. Dann berechnen Sie auf Ihren Zeichenroutinen die Positionen basierend auf tick
var, da sie die aktuelle Zeit der Anwendung enthält.
Der große Vorteil der Option 2
ist, dass Ihre Anwendung viel einfacher zu debuggen ist, da Sie mit der Variable tick
herumspielen können, wann immer Sie wollen, vorwärts und zurück. Dies ist ein großes Plus.
Regel # 1. Machen Sie nicht update () oder loop () Art von Funktionen abhängig davon, wie oft es aufgerufen wird.
Sie können Ihren gewünschten FPS nicht wirklich erreichen. Sie könnten versuchen, es zu erhöhen, indem Sie einige teure Operationen überspringen oder verlangsamen, indem Sie sleep () - Funktionen aufrufen. Aber selbst mit diesen Techniken unterscheidet sich FPS fast immer von der genauen FPS, die Sie wollen.
Der übliche Weg, um mit diesem Problem umzugehen, ist die verstrichene Zeit seit dem letzten Update. Zum Beispiel
%Vor%Gibt es eine Möglichkeit zu berechnen, wie viele Aktualisierungen vorgenommen werden sollten, um die gewünschte Bildrate zu erreichen, NICHT systemspezifisch?
Nein.
Es gibt keine Möglichkeit, genau zu berechnen, wie viele Aktualisierungen aufgerufen werden sollten, um die gewünschte Bildfrequenz zu erreichen.
Sie können jedoch messen, wie viel Zeit seit dem letzten Frame vergangen ist, die aktuelle Framerate entsprechend berechnen, sie mit der gewünschten Framerate vergleichen und dann ein bisschen Ruhezustand um die aktuelle Framerate auf den gewünschten Wert zu reduzieren. Keine präzise Lösung, aber es wird funktionieren.
Ich habe das für Windows gefunden, aber ich würde gerne wissen, ob sowas in openGL selbst existiert. Es sollte eine Art Timer sein.
OpenGL beschäftigt sich nur mit Rendering und hat nichts mit Timern zu tun. Auch die Verwendung von Windows-Timern ist keine gute Idee. Verwenden Sie QueryPerformanceCounter, GetTickCount oder SDL_GetTicks, um zu messen, wie viel Zeit vergangen ist, und schlafen Sie, um die gewünschte Framerate zu erreichen.
Oder wie kann ich sonst verhindern, dass FPS dramatisch abfällt oder ansteigt?
Sie verhindern, dass FPS durch Schlafen erhöht wird.
Damit verhindert wird, dass FPS verloren geht ...
Es ist wahnsinnig breites Thema. Mal schauen. Es geht ungefähr so: Verwenden Sie Vertex-Pufferobjekte oder Anzeigelisten, Profilanwendung , verwenden Sie keine wahnsinnig großen Texturen, Verwenden Sie nicht zu viel Alpha-Blending, vermeiden Sie "RAW" OpenGL (glVertex3f), rendern Sie keine unsichtbaren Objekte (auch wenn keine Polygone gezeichnet werden, die Verarbeitung dauert Zeit), überlegen Sie, ob Sie BSPs oder Octrees zum Rendern komplexer Szenen lernen parametrische Flächen und Kurven, verwenden Sie nicht unnötig viele Primitive (wenn Sie einen Kreis mit einer Million Polygonen rendern, wird niemand den Unterschied bemerken), deaktivieren Sie vsync. Kurz gesagt - reduzieren Sie auf die absolut mögliche Mindestanzahl von Renderaufrufen, die Anzahl der gerenderten Polygone, die Anzahl der gerenderten Pixel, die Anzahl gelesener Texel, lesen Sie alle verfügbaren Leistungsdokumentation aus NVidia, und Sie sollten eine Leistungssteigerung erhalten.
Sie wollen Ihre Bildrate unbedingt drosseln, alles hängt davon ab, was Sie haben in dieser Rendering-Schleife und was Ihre Anwendung tut. Vor allem mit ihm Physik / Netzwerk. Oder wenn Sie irgendeine Art von Grafikbearbeitung mit einem externen Toolkit durchführen (Cairo, QPainter, Skia, AGG, ...), außer Sie wollen keine Synchronisationsergebnisse oder 100% CPU-Auslastung.
Sie stellen die falsche Frage. Ihr Monitor wird immer nur mit 60 fps angezeigt (50 fps in Europa oder möglicherweise 75 fps, wenn Sie ein Pro-Gamer sind).
Stattdessen sollten Sie versuchen, Ihre fps bei 60 oder 30 zu sperren. Es gibt OpenGL-Erweiterungen, mit denen Sie das tun können. Die Erweiterungen sind jedoch nicht plattformübergreifend (glücklicherweise sind sie nicht grafikkartenspezifisch oder würden wirklich gruselig).
wglSwapIntervalEXT
glXSwapIntervalSGI
Diese Erweiterungen sind eng mit dem v-sync Ihres Monitors verknüpft. Sobald aktivierte Aufrufe zum Auslagern, blockiert der OpenGL-Back-Buffer solange, bis der Monitor dafür bereit ist. Das ist so, als würden Sie in Ihrem Code eine Ruhezeit von 60 fps (oder 30, oder 15 oder eine andere Zahl, wenn Sie keinen Monitor verwenden, der mit 60 Hz angezeigt wird) erzwingen. Der Unterschied zu "sleep" ist immer perfekt getimte statt einer begründeten Schätzung basierend auf der Dauer des letzten Frames.
Hier ist ein ähnliche Frage, mit meiner Antwort und bearbeiteten Beispiel
Ich mag auch die Antwort von deft_code und werde versuchen hinzuzufügen, was er meiner Lösung vorschlägt.
Der entscheidende Teil meiner Antwort ist:
Wenn Sie daran denken, Frames zu VERRINGERN und zu beschleunigen, müssen Sie genau überlegen, ob Sie Rendering- oder Animationsframes in jedem Fall meinen. In diesem Beispiel wird die Renderdrosselung für einfache Animationen mit der Animationsbeschleunigung kombiniert, wenn Frames in einer möglicherweise langsamen Animation gelöscht werden sollen.
Das Beispiel zeigt Animationscode, der mit der gleichen Geschwindigkeit rendert, unabhängig davon, ob der Benchmarkmodus oder der feste FPS-Modus aktiv ist. Eine vor der Änderung ausgelöste Animation behält nach der Änderung sogar eine konstante Geschwindigkeit bei.
Tags und Links c++ opengl performance