QOpenGLTimerQuery Class
Die Klasse QOpenGLTimerQuery umhüllt ein OpenGL-Timer-Abfrageobjekt. Mehr...
Kopfzeile: | #include <QOpenGLTimerQuery> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake: | QT += opengl |
Vererbungen: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QOpenGLTimerQuery ist Teil von Rendering in 3D.
Öffentliche Funktionen
QOpenGLTimerQuery(QObject *parent = nullptr) | |
virtual | ~QOpenGLTimerQuery() |
void | begin() |
bool | create() |
void | destroy() |
void | end() |
bool | isCreated() const |
bool | isResultAvailable() const |
GLuint | objectId() const |
void | recordTimestamp() |
GLuint64 | waitForResult() const |
GLuint64 | waitForTimestamp() const |
Detaillierte Beschreibung
OpenGL Timer Query-Objekte sind von OpenGL verwaltete Ressourcen zur Messung der Ausführungszeiten von Sequenzen von OpenGL-Befehlen auf der GPU.
OpenGL bietet verschiedene Stufen der Unterstützung für Timer-Queries, abhängig von der Version von OpenGL und dem Vorhandensein der ARB_timer_query oder EXT_timer_query Erweiterungen. Die Unterstützung lässt sich wie folgt zusammenfassen:
- OpenGL >=3.3 bietet volle Unterstützung für alle Timer-Abfragefunktionen.
- OpenGL 3.2 mit der ARB_timer_query-Erweiterung bietet volle Unterstützung für alle Timer-Abfrage-Funktionen.
- OpenGL <=3.2 mit der EXT_timer_query-Erweiterung bietet eingeschränkte Unterstützung, da der Zeitstempel der GPU nicht abgefragt werden kann. Die Stellen, an denen sich dies auf Funktionen auswirkt, die von Qt-Klassen bereitgestellt werden, werden in der Funktionsdokumentation hervorgehoben.
- OpenGL ES 2 (und OpenGL ES 3) bieten keine Unterstützung für OpenGL-Timer-Abfragen.
OpenGL stellt Zeit mit einer Granularität von 1 Nanosekunde (1e-9 Sekunden) dar. Dies hat zur Folge, dass 32-Bit-Ganzzahlen nur eine mögliche Gesamtdauer von etwa 4 Sekunden ergeben würden, was bei schlecht funktionierenden oder langwierigen Operationen leicht überschritten werden kann. OpenGL verwendet daher 64-Bit-Integer-Typen zur Darstellung von Zeiten. Eine GLuint64-Variable hat eine ausreichende Breite, um eine Dauer von Hunderten von Jahren zu enthalten, was für Echtzeit-Rendering-Bedürfnisse ausreichend ist.
Wie bei den anderen Qt OpenGL Klassen hat QOpenGLTimerQuery eine create() Funktion, um das zugrundeliegende OpenGL-Objekt zu erstellen. Damit kann der Entwickler sicherstellen, dass ein gültiger aktueller OpenGL-Kontext vorhanden ist.
Einmal erstellt, können Timer-Abfragen auf eine von mehreren Arten ausgegeben werden. Die einfachste Methode besteht darin, einen Block von Befehlen mit den Aufrufen begin() und end() abzugrenzen. Dadurch wird OpenGL angewiesen, die Zeit zu messen, die vom Abschluss aller vor begin() erteilten Befehle bis zum Abschluss aller vor end() erteilten Befehle vergeht.
Am Ende eines Frames können wir die Ergebnisse abrufen, indem wir waitForResult() aufrufen. Wie der Name dieser Funktion schon sagt, blockiert sie die CPU-Ausführung, bis OpenGL mitteilt, dass das Ergebnis der Timer-Abfrage verfügbar ist. Um das Blockieren zu vermeiden, können Sie überprüfen, ob das Abfrageergebnis verfügbar ist, indem Sie isResultAvailable() aufrufen. Beachten Sie, dass moderne GPUs tief in der Pipeline sind und Abfrageergebnisse möglicherweise erst 1-5 Frames nach ihrer Ausgabe verfügbar werden.
Beachten Sie, dass OpenGL keine Verschachtelung oder Verschachtelung von mehreren Timer-Abfragen mit begin() und end() erlaubt. Die Verwendung mehrerer Timer-Abfragen und recordTimestamp() vermeidet diese Einschränkung. Bei Verwendung von recordTimestamp() kann das Ergebnis zu einem späteren Zeitpunkt mit isResultAvailable() und waitForResult() abgerufen werden. Qt bietet die Komfortklasse QOpenGLTimeMonitor, die bei der Verwendung mehrerer Abfrageobjekte hilft.
Siehe auch QOpenGLTimeMonitor.
Dokumentation der Mitgliedsfunktionen
[explicit]
QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)
Erzeugt eine QOpenGLTimerQuery-Instanz mit dem angegebenen parent. Sie müssen create() mit einem gültigen OpenGL-Kontext aufrufen, bevor Sie es verwenden.
[virtual noexcept]
QOpenGLTimerQuery::~QOpenGLTimerQuery()
Zerstört die QOpenGLTimerQuery und die zugrunde liegende OpenGL-Ressource.
void QOpenGLTimerQuery::begin()
Markiert den Startpunkt in der OpenGL-Befehlswarteschlange für eine Sequenz von Befehlen, die von diesem Abfrageobjekt zeitlich erfasst werden sollen.
Dies ist nützlich für einfache Anwendungsfälle. Normalerweise ist es besser, recordTimestamp() zu verwenden.
Siehe auch end(), isResultAvailable(), waitForResult(), und recordTimestamp().
bool QOpenGLTimerQuery::create()
Erzeugt das zugrundeliegende OpenGL-Timer-Abfrageobjekt. Es muss ein gültiger OpenGL-Kontext vorhanden sein, der aktuelle Abfrageobjekte unterstützt, damit diese Funktion erfolgreich ist.
Gibt true
zurück, wenn das OpenGL-Timer-Abfrageobjekt erfolgreich erstellt wurde.
void QOpenGLTimerQuery::destroy()
Zerstört das zugrunde liegende OpenGL-Timer-Abfrageobjekt. Der Kontext, der beim Aufruf von create() aktuell war, muss beim Aufruf dieser Funktion aktuell sein.
void QOpenGLTimerQuery::end()
Markiert den Endpunkt in der OpenGL-Befehlswarteschlange für eine Sequenz von Befehlen, die durch dieses Abfrageobjekt zeitlich festgelegt werden sollen.
Dies ist nützlich für einfache Anwendungsfälle. Normalerweise ist es besser, recordTimestamp() zu verwenden.
Siehe auch begin(), isResultAvailable(), waitForResult(), und recordTimestamp().
bool QOpenGLTimerQuery::isCreated() const
Gibt true
zurück, wenn das zugrunde liegende OpenGL-Abfrageobjekt erstellt wurde. Wenn dies true
zurückgibt und der zugehörige OpenGL-Kontext aktuell ist, dann können Sie Abfragen mit diesem Objekt durchführen.
bool QOpenGLTimerQuery::isResultAvailable() const
Gibt true
zurück, wenn das Ergebnis der OpenGL-Timer-Abfrage verfügbar ist.
Diese Funktion ist nicht blockierend und sollte idealerweise verwendet werden, um die Verfügbarkeit des Abfrageergebnisses zu prüfen, bevor waitForResult() aufgerufen wird.
Siehe auch waitForResult().
GLuint QOpenGLTimerQuery::objectId() const
Gibt die ID des zugrunde liegenden OpenGL-Abfrageobjekts zurück.
void QOpenGLTimerQuery::recordTimestamp()
Setzt einen Marker in die OpenGL-Befehlswarteschlange für die GPU, um den Zeitstempel aufzuzeichnen, wenn dieser Marker von der GPU erreicht wird. Diese Funktion ist nicht blockierend und das Ergebnis wird zu einem späteren Zeitpunkt verfügbar sein.
Die Verfügbarkeit des Ergebnisses kann mit isResultAvailable() überprüft werden. Das Ergebnis kann mit waitForResult() abgerufen werden, was blockiert, wenn das Ergebnis noch nicht verfügbar ist.
Siehe auch waitForResult(), isResultAvailable(), begin(), und end().
GLuint64 QOpenGLTimerQuery::waitForResult() const
Gibt das Ergebnis der OpenGL-Timer-Abfrage zurück.
Diese Funktion blockiert, bis das Ergebnis von OpenGL zur Verfügung gestellt wird. Es wird empfohlen, isResultAvailable() aufzurufen, um sicherzustellen, dass das Ergebnis verfügbar ist, um unnötiges Blockieren und Abwürgen zu vermeiden.
Siehe auch isResultAvailable().
GLuint64 QOpenGLTimerQuery::waitForTimestamp() const
Gibt den aktuellen Zeitstempel der GPU zurück, wenn alle zuvor ausgegebenen OpenGL-Befehle empfangen, aber nicht unbedingt von der GPU ausgeführt wurden.
Diese Funktion blockiert, bis das Ergebnis zurückgegeben wird.
Siehe auch recordTimestamp().
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.