- class QOpenGLTimerQuery#
该
QOpenGLTimerQuery
类封装了一个 OpenGL 时间查询对象。 更多…简介#
方法#
def
__init__()
def
begin()
def
create()
def
destroy()
def
end()
def
isCreated()
定义
objectId()
注意
此文档可能包含从 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 变量足够宽,可以包含长达数百年的人的时间,这对于实时渲染的需求来说已经足够了。
与其他 QtOpenGL 类一样,
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
,它有助于使用多个查询对象。See also
创建一个带有指定
parent
的QOpenGLTimerQuery
实例。在使用之前,必须用有效的OpenGL上下文调用create()
。- begin()#
在这个查询对象中标记OpenGL命令队列中一系列要计时的命令的起点。
这对于简单用例很有用。通常,使用
recordTimestamp()
会更好。- create()#
- 返回类型::
bool
创建底层OpenGL计时器查询对象。若要使此函数成功执行,必须有一个有效的OpenGL上下文,该上下文当前支持查询对象。
如果成功创建OpenGL计时器查询对象,则返回
true
。- destroy()#
销毁底层OpenGL计时器查询对象。调用此函数时,当前上下文必须与在调用
create()
时相同的当前上下文。- end()#
在此查询对象中标记OpenGL命令队列中要计时的一系列命令的终点。
这对于简单用例很有用。通常,使用
recordTimestamp()
会更好。- isCreated()#
- 返回类型::
bool
如果底层OpenGL查询对象已被创建,则返回
true
。如果此函数返回true
且相关OpenGL上下文是当前的,那么您可以使用此对象发出查询。- isResultAvailable()#
- 返回类型::
bool
如果OpenGL计时器查询结果可用,则返回
true
。此函数是非阻塞的,最好在调用
waitForResult()
之前检查查询结果是否可用。See also
- objectId()#
- 返回类型::
int
返回底层OpenGL查询对象的ID。
- recordTimestamp()#
在OpenGL命令队列中放置一个标记,以便GPU在达到此标记时记录时间戳。此函数为非阻塞函数,结果将在稍后的某个时间点可用。
可以使用
isResultAvailable()
来检查结果是否可用。可以使用waitForResult()
来获取结果,如果在结果不可用的情况下调用将阻塞。See also
- waitForResult()#
- 返回类型::
int
返回OpenGL计时器查询的结果。
此函数会阻塞直到OpenGL提供结果。建议在使用之前调用
isResultAvailable()
以确保结果可用,以避免不必要的阻塞和停滞。See also
- waitForTimestamp()#
- 返回类型::
int
返回GPU当前时间戳,表示所有之前发出的OpenGL命令都已收到但尚未被GPU执行。
此函数会阻塞直到返回结果。
See also