QOpenGLTimerQuery 类

QOpenGLTimerQuery 类封装了一个 OpenGL 时钟查询对象。 更多...

头文件 #include <QOpenGLTimerQuery>
CMakefind_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmakeQT += opengl
继承 QObject

公共函数

QOpenGLTimerQuery(QObject *parent = nullptr)
virtual~QOpenGLTimerQuery()
voidbegin()
boolcreate()
voiddestroy()
voidend()
boolisCreated() const
boolisResultAvailable() const
GLuintobjectId() const
voidrecordTimestamp()
GLuint64waitForResult() const
GLuint64waitForTimestamp() const

详细描述

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

OpenGL 根据你拥有的 OpenGL 版本和是否存在 ARB_timer_query 或 EXT_timer_query 扩展提供各种级别的支持。支持可以总结如下:

  • OpenGL >=3.3 提供对所有时钟查询功能的全支持。
  • OpenGL 3.2 与 ARB_timer_query 扩展一起提供对所有时钟查询功能的全支持。
  • OpenGL <=3.2 与 EXT_timer_query 扩展一起提供有限支持,因为不能查询 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

成员函数文档

[显式] QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)

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

[虚函数 无异常抛出] 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记录当标记被GPU到达时的时间戳。此函数是非阻塞的,结果将在稍后某个时间点变得可用。

可以通过 isResultAvailable() 检查结果是否可用。可以通过 waitForResult() 获取结果,如果结果尚未可用,它会阻塞。

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

GLuint64 QOpenGLTimerQuery::waitForResult() const

返回OpenGL计时查询的结果。

此函数将阻塞,直到OpenGL提供了结果。建议调用 isResultAvailable() 以确保结果可用,以避免不必要的阻塞和停滞。

另请参阅 isResultAvailable()。

GLuint64 QOpenGLTimerQuery::waitForTimestamp() const

返回GPU当前时间戳,此时所有之前发出的OpenGL命令都已接收但尚未由GPU执行。

此函数将阻止,直到返回结果。

另请参阅 recordTimestamp()。

© 2024 Qt公司有限公司。此处包含的文档贡献归各自所有者所有。本文档受GNU自由文档许可证1.3版的许可,该许可证由自由软件开发基金会发布。Qt及其标志是世界各地芬兰和/或其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。