Auf dieser Seite

QOpenGLTimerQuery Class

Die Klasse „QOpenGLTimerQuery“ umschließt ein OpenGL-Timer-Abfrageobjekt. Mehr...

Header: #include <QOpenGLTimerQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
Erbt von: QObject

Ö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

Ausführliche Beschreibung

OpenGL-Timer-Query-Objekte sind von OpenGL verwaltete Ressourcen zur Messung der Ausführungszeiten von OpenGL-Befehlssequenzen auf der GPU.

OpenGL bietet je nach OpenGL-Version und dem Vorhandensein der Erweiterungen ARB_timer_query oder EXT_timer_query unterschiedliche Unterstützungsstufen für Timer-Abfragen. Die Unterstützung lässt sich wie folgt zusammenfassen:

  • OpenGL >= 3.3 bietet vollständige Unterstützung für alle Timer-Abfragefunktionen.
  • OpenGL 3.2 mit der Erweiterung „ARB_timer_query“ bietet vollständige Unterstützung für alle Timer-Abfragefunktionen.
  • Qt OpenGL <= 3.2 mit der Erweiterung „EXT_timer_query“ bietet eingeschränkte Unterstützung, da der Zeitstempel der GPU nicht abgefragt werden kann. Stellen, an denen sich dies auf von Qt-Klassen bereitgestellte Funktionen auswirkt, werden in der Funktionsdokumentation hervorgehoben.
  • OpenGL ES 2 (und OpenGL ES 3) bieten keinerlei Unterstützung für OpenGL-Timer-Abfragen.

OpenGL stellt Zeit mit einer Granularität von 1 Nanosekunde (1e-9 Sekunden) dar. Infolgedessen würden 32-Bit-Ganzzahlen nur eine mögliche Gesamtdauer von etwa 4 Sekunden ermöglichen, was bei leistungsschwachen oder lang andauernden Operationen leicht überschritten werden könnte. OpenGL verwendet daher 64-Bit-Ganzzahltypen zur Darstellung von Zeiten. Eine GLuint64-Variable verfügt über eine ausreichende Breite, um eine Dauer von Hunderten von Jahren zu erfassen, was für die Anforderungen des Echtzeit-Renderings völlig ausreicht.

Wie bei den anderen „ Qt OpenGL “-Klassen verfügt „QOpenGLTimerQuery“ über eine Funktion „ create()“ zum Erstellen des zugrunde liegenden OpenGL-Objekts. Dies soll es dem Entwickler ermöglichen, sicherzustellen, dass zu diesem Zeitpunkt ein gültiger aktueller OpenGL-Kontext vorhanden ist.

Nach der Erstellung können Timer-Abfragen auf verschiedene Arten ausgelöst werden. Die einfachste Methode besteht darin, einen Befehlsblock durch Aufrufe von ` begin()` und ` end()` abzugrenzen. Dadurch wird OpenGL angewiesen, die Zeit zu messen, die von der Ausführung aller vor ` begin()` erteilten Befehle bis zur Ausführung aller vor ` end()` erteilten Befehle vergeht.

Am Ende eines Frames können wir die Ergebnisse durch den Aufruf von ` waitForResult()` abrufen. Wie der Name dieser Funktion schon andeutet, blockiert sie die CPU-Ausführung, bis OpenGL meldet, dass das Ergebnis der Timer-Abfrage verfügbar ist. Um eine Blockierung zu vermeiden, können Sie durch den Aufruf von ` isResultAvailable()` prüfen, ob das Abfrageergebnis bereits vorliegt. Beachten Sie, dass moderne GPUs über eine tief verschachtelte Pipeline verfügen und Abfrageergebnisse möglicherweise erst 1 bis 5 Frames nach ihrer Ausgabe verfügbar sind.

Beachten Sie, dass OpenGL keine Verschachtelung oder Verflechtung mehrerer Timer-Abfragen mit ` begin()` und ` end()` zulässt. Durch die Verwendung mehrerer Timer-Abfragen und ` recordTimestamp()` lässt sich diese Einschränkung umgehen. Bei Verwendung von ` recordTimestamp()` kann das Ergebnis zu einem späteren Zeitpunkt mit ` isResultAvailable()` und ` waitForResult()` abgerufen werden. Qt stellt die Komfortklasse ` QOpenGLTimeMonitor ` bereit, die die Verwendung mehrerer Abfrageobjekte erleichtert.

Siehe auch QOpenGLTimeMonitor.

Dokumentation zu den Member-Funktionen

[explicit] QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)

Erstellt eine `QOpenGLTimerQuery`-Instanz mit dem angegebenen ` parent`. Vor der Verwendung müssen Sie ` create()` mit einem gültigen OpenGL-Kontext aufrufen.

[virtual noexcept] QOpenGLTimerQuery::~QOpenGLTimerQuery()

Löscht die „ QOpenGLTimerQuery “ und die zugrunde liegende OpenGL-Ressource.

void QOpenGLTimerQuery::begin()

Markiert den Startpunkt in der OpenGL-Befehlswarteschlange für eine Folge von Befehlen, deren Ausführung von diesem Abfrageobjekt zeitlich gesteuert werden soll.

Dies ist für einfache Anwendungsfälle nützlich. In der Regel ist es besser, ` recordTimestamp()` zu verwenden.

Siehe auch „ end()“, „ isResultAvailable()“, „ waitForResult()“ und „ recordTimestamp()“.

bool QOpenGLTimerQuery::create()

Erstellt das zugrunde liegende OpenGL-Timer-Abfrageobjekt. Damit diese Funktion erfolgreich ausgeführt werden kann, muss ein gültiger OpenGL-Kontext vorhanden sein, der Abfrageobjekte unterstützt.

Gibt „ true “ zurück, wenn das OpenGL-Timer-Abfrageobjekt erfolgreich erstellt wurde.

void QOpenGLTimerQuery::destroy()

Löscht das zugrunde liegende OpenGL-Timer-Abfrageobjekt. Der Kontext, der zum Zeitpunkt des Aufrufs von ` create()` aktiv war, muss auch beim Aufruf dieser Funktion aktiv sein.

void QOpenGLTimerQuery::end()

Markiert den Endpunkt in der OpenGL-Befehlswarteschlange für eine Folge von Befehlen, deren Ausführung von diesem Abfrageobjekt zeitlich erfasst werden soll.

Dies ist für einfache Anwendungsfälle nützlich. In der Regel 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 „ true “ zurückgegeben wird und der zugehörige OpenGL-Kontext aktiv ist, können Sie mit diesem Objekt Abfragen ausfü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 vor dem Aufruf von ` waitForResult()` zu prüfen, ob das Abfrageergebnis verfügbar ist.

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, damit diese den Zeitstempel aufzeichnet, sobald sie diesen Marker erreicht. Diese Funktion ist nicht blockierend, und das Ergebnis steht zu einem späteren Zeitpunkt zur Verfügung.

Die Verfügbarkeit des Ergebnisses kann mit ` isResultAvailable()` überprüft werden. Das Ergebnis kann mit ` waitForResult()` abgerufen werden, wobei die Funktion 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 bereitgestellt wird. Es wird empfohlen, ` isResultAvailable()` aufzurufen, um sicherzustellen, dass das Ergebnis verfügbar ist, und so unnötiges Blockieren und Verzögern 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 noch nicht unbedingt von der GPU ausgeführt wurden.

Diese Funktion blockiert, bis das Ergebnis zurückgegeben wird.

Siehe auch ` recordTimestamp()`.

© 2026 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.