本页内容

QOpenGLTimerQuery Class

QOpenGLTimerQuery 类封装了一个 OpenGL 定时器查询对象。更多内容...

头文件: #include <QOpenGLTimerQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
继承自: QObject

公共函数

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

详细说明

OpenGL 定时器查询对象是 OpenGL 管理的资源,用于测量 GPU 上 OpenGL 命令序列的执行时间。

OpenGL 对计时器查询的支持程度各不相同,这取决于您使用的 OpenGL 版本以及是否具备 ARB_timer_query 或 EXT_timer_query 扩展。支持情况可概括如下:

  • OpenGL 3.3 及以上版本完全支持所有计时器查询功能。
  • 带有 ARB_timer_query 扩展的 OpenGL 3.2 完全支持所有计时器查询功能。
  • 配备 EXT_timer_query 扩展的 Qt OpenGL <=3.2 仅提供有限支持,即无法查询 GPU 的时间戳。这将对 Qt 类提供的函数造成影响,相关内容将在函数文档中予以标注。
  • OpenGL ES 2(以及 OpenGL ES 3)不提供对 OpenGL 定时器查询的任何支持。

OpenGL 以 1 纳秒(1e-9 秒)为时间粒度。因此,32 位整数所能表示的总时长仅约为 4 秒,而在性能较差或耗时较长的操作中,很容易超过这一限制。 因此,OpenGL 使用 64 位整数类型来表示时间。一个 GLuint64 变量具有足够的位宽来容纳数百年的持续时间,这对于实时渲染的需求来说绰绰有余。

与其他Qt OpenGL 类一样,QOpenGLTimerQuery也提供了create()函数来创建底层的OpenGL对象。此设计旨在让开发者确保在该时刻存在一个有效的当前OpenGL上下文。

创建完成后,可以通过多种方式发出计时器查询。最简单的方法是使用begin()和end()调用来限定一组命令。这会指示OpenGL测量从begin()之前发出的所有命令完成,到end()之前发出的所有命令完成之间所花费的时间。

在帧结束时,我们可以通过调用waitForResult() 来获取结果。正如该函数名称所示,它会阻塞 CPU 执行,直到 OpenGL 通知计时器查询结果已可用。为避免阻塞,你可以通过调用isResultAvailable() 来检查查询结果是否已可用。 请注意,现代 GPU 具有深度流水线架构,查询结果在发出后可能需要 1 到 5 个帧的时间才会可用。

请注意,OpenGL 不允许使用begin() 和end() 嵌套或交错执行多个定时器查询。使用多个定时器查询并配合recordTimestamp() 可规避此限制。使用recordTimestamp() 时,可通过isResultAvailable() 和waitForResult() 在稍后时间获取结果。Qt 提供了便利类QOpenGLTimeMonitor ,可协助管理多个查询对象。

另请参阅 QOpenGLTimeMonitor 。

成员函数文档

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

使用给定的parent 创建一个QOpenGLTimerQuery实例。使用前,必须先在有效的OpenGL上下文中调用create()。

[virtual noexcept] QOpenGLTimerQuery::~QOpenGLTimerQuery()

销毁QOpenGLTimerQuery 及其底层的OpenGL资源。

void QOpenGLTimerQuery::begin()

在 OpenGL 命令队列中标记一个起始点,用于由该查询对象进行计时的一系列命令。

这适用于简单的用例。通常,最好使用recordTimestamp()。

另请参阅 end()、isResultAvailable()、waitForResult() 和recordTimestamp()。

bool QOpenGLTimerQuery::create()

创建底层的 OpenGL 定时器查询对象。要使此函数成功,当前必须存在一个支持查询对象的有效 OpenGL 上下文。

如果 OpenGL 定时器查询对象创建成功,则返回true 。

void QOpenGLTimerQuery::destroy()

销毁底层的 OpenGL 定时器查询对象。调用此函数时,当前上下文必须与调用create() 时相同的上下文。

void QOpenGLTimerQuery::end()

在 OpenGL 命令队列中标记该查询对象将用于计时的一系列命令的终点。

这适用于简单的用例。通常,最好使用recordTimestamp()。

另请参阅 begin()、isResultAvailable()、waitForResult() 以及recordTimestamp()。

bool QOpenGLTimerQuery::isCreated() const

如果底层的 OpenGL 查询对象已创建,则返回 `true `。如果返回 `true ` 且关联的 OpenGL 上下文是当前的,则可以使用该对象发出查询。

bool QOpenGLTimerQuery::isResultAvailable() const

如果 OpenGL 定时器查询结果已可用,则返回 `true `。

该函数是非阻塞的,理想情况下应在调用waitForResult() 之前使用它来检查查询结果是否可用。

另请参阅 waitForResult()。

GLuint QOpenGLTimerQuery::objectId() const

返回底层 OpenGL 查询对象的 ID。

void QOpenGLTimerQuery::recordTimestamp()

在 OpenGL 命令队列中放置一个标记,以便 GPU 在到达该标记时记录时间戳。该函数是非阻塞的,结果将在稍后时间可用。

可通过 `isResultAvailable()` 检查结果是否可用。可通过 `waitForResult()` 获取结果,若结果尚未可用,该调用将阻塞。

另请参阅 waitForResult()、isResultAvailable()、begin() 以及end()。

GLuint64 QOpenGLTimerQuery::waitForResult() const

返回 OpenGL 定时器查询的结果。

该函数将阻塞,直到 OpenGL 提供结果为止。建议调用 `isResultAvailable()` 以确保结果已就绪,从而避免不必要的阻塞和延迟。

另请参阅 isResultAvailable()。

GLuint64 QOpenGLTimerQuery::waitForTimestamp() const

返回 GPU 的当前时间戳,此时所有先前发出的 OpenGL 命令均已接收,但 GPU 未必已执行这些命令。

该函数将阻塞,直到返回结果为止。

另请参阅 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.