QOpenGLTimerQuery 类
QOpenGLTimerQuery 类封装了一个 OpenGL 时钟查询对象。 更多...
头文件 | #include <QOpenGLTimerQuery> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake | QT += opengl |
继承 | QObject |
- 包括继承成员的所有成员列表
- QOpenGLTimerQuery 是部分 3D 渲染。
公共函数
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 提供对所有时钟查询功能的全支持。
- 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公司有限公司的商标。所有其他商标均为各自所有者的财产。