PySide6.QtOpenGL.QOpenGLTimerQuery¶
- class QOpenGLTimerQuery¶
QOpenGLTimerQuery
类封装了一个 OpenGL 计时查询对象。更多…概要¶
方法¶
def
__init__()
def
begin()
def
create()
def
destroy()
def
end()
def
isCreated()
def
objectId()
def
waitForResult()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
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
,有助于使用多个查询对象。另请参阅
创建一个带有给定
parent
的QOpenGLTimerQuery
实例。在使用之前,您必须使用有效的OpenGL上下文调用create()
。- begin()¶
标记OpenGL命令队列中一系列命令的起点,这些命令将由该查询对象计时。
这对于简单的用例很有用。通常最好使用
recordTimestamp()
。- create()¶
- Return type:
布尔
创建底层的OpenGL计时查询对象。必须有一个支持查询对象的有效OpenGL上下文,此函数才能成功。
如果OpenGL计时器查询对象成功创建,则返回
true
。- destroy()¶
销毁底层的OpenGL计时器查询对象。调用此函数时,必须与调用
create()
时的上下文相同。- end()¶
标记OpenGL命令队列中一系列命令的结束点,这些命令将由该查询对象计时。
这对于简单的使用场景很有用。通常最好使用
recordTimestamp()
。- isCreated()¶
- Return type:
布尔
如果底层的OpenGL查询对象已创建,则返回
true
。如果返回true
并且关联的OpenGL上下文是当前的,那么你可以使用此对象发出查询。- isResultAvailable()¶
- Return type:
布尔
如果OpenGL计时器查询结果可用,则返回
true
。此函数是非阻塞的,理想情况下应在调用
waitForResult()
之前用于检查查询结果的可用性。另请参阅
- objectId()¶
- Return type:
整数
返回底层OpenGL查询对象的id。
- recordTimestamp()¶
在OpenGL命令队列中放置一个标记,以便GPU在到达此标记时记录时间戳。此函数是非阻塞的,结果将在稍后的某个时间可用。
可以使用
isResultAvailable()
来检查结果的可用性。可以使用waitForResult()
来获取结果,如果结果尚未可用,则会阻塞。- waitForResult()¶
- Return type:
整数
返回OpenGL计时器查询的结果。
此函数将阻塞,直到OpenGL使结果可用。建议调用
isResultAvailable()
以确保结果可用,以避免不必要的阻塞和停滞。另请参阅
- waitForTimestamp()¶
- Return type:
整数
返回GPU当前的时间戳,当所有先前发出的OpenGL命令已被接收但尚未被GPU执行时。
此函数会阻塞,直到返回结果。
另请参阅