errorman

不积跬步,无以至千里

导航

QOpenGLTimerQuery Class

Posted on 2023-03-16 10:59  Clemens  阅读(56)  评论(0编辑  收藏  举报

Detailed Description

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。

 

Member Function Documentation

QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)

创建具有给定父对象parent的QOpenGLTimerQuery实例。在使用之前,必须使用有效的OpenGL上下文调用create()函数。

 

[virtual] QOpenGLTimerQuery::~QOpenGLTimerQuery()

销毁QOpenGLTimerQuery和底层的OpenGL资源。

 

void QOpenGLTimerQuery::begin()

在OpenGL命令队列中标记一个起始点,用于计时此查询对象所记录的一系列命令。

这对于简单的用例非常有用。通常最好使用recordTimestamp()。

参见end(),isResultAvailable(),waitForResult()和recordTimestamp()。

 

bool QOpenGLTimerQuery::create()

创建底层的OpenGL计时器查询对象。必须有一个支持查询对象的有效OpenGL上下文,这个函数才会成功。

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

 

void QOpenGLTimerQuery::destroy()

销毁底层的OpenGL计时器查询对象。在调用此函数时,创建时的上下文必须是当前上下文。

 

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()。