glQueryCounter和GL_TIMESTAMP能真正衡量什么?

时间:2018-08-30 09:17:32

标签: opengl

我的主要问题是,在GPU上执行所有先前的命令后,是否有人可以确认glQueryCounter捕获了GL_TIMESTAMP?这样两个时间戳之间的差异大致等于捕获GL_ELAPSED_TIME吗?


我正在寻找一种测量两个以上时间戳之间的时序的方法,同时确保在执行所有先前计划的命令时捕获时间戳。我知道GL_TIME_ELAPSED可以在两个时间点上工作,但是我需要可以嵌套并与单个帧中的多个时间戳一起使用的东西,这就是为什么我想使用GL_TIMESTAMP。时间戳可以是frameStartdrawCertainThingsStartdrawCertainThingsEndframeEnd。不过,GL_TIMESTAMP上的规范使我感到困惑,而且我不确定它是否符合我的期望。

不相交的计时器查询规范:https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt


某些信息似乎矛盾。例如: glQueryCounter:“在所有先前的命令到达GL服务器但尚未执行之后,将GL时间记录到查询对象中”

disjoint timer query spec另一方面说 “在GL客户端,服务器状态和帧缓冲区上的所有先前命令都已完全实现之后,才记录时间。”这听起来像是在记录了先前调度的命令之后记录了时间戳。 它还特别提到,同步替代方法GetInteger64v无需执行命令即可返回时间戳,这强调了glQueryCounter应该在先前命令执行后返回时间戳,这与khronos页面所说的相反。


该规范还附带一个示例: “(2)本示例使用QueryCounter”部分应该说明如何使用glQueryCounterGL_TIMESTAMP来测量GPU上的经过时间。但是,此示例似乎不完整。从未使用过两个变量_timeStart__timeEnd_。相反,该示例将GL_TIMESTAMP的值直接读取到_timeElapsed_变量中,这似乎是错误的。根据我的理解,我们需要将GL_TIMESTAMP读入_timeStart__timeEnd_中,然后计算_timeElapsed_ = _timeEnd_ - _timeStart_

1 个答案:

答案 0 :(得分:5)

不幸的是,OpenGL函数文档页面上有很多错误。这就是其中之一。由于描述文字与简介文字相矛盾,所以甚至是自我矛盾的。

OpenGL {em>规范对于glQueryCounter的行为非常清楚:

  

在GL客户端上的所有先前命令和服务器状态以及帧缓冲区完全实现之后,记录时间。


  

该规范还附带一个示例

规格错误。 ARB_timer_query规范适用于桌面OpenGL。 EXT_disjoint_timer_query用于OpenGL ES。不要混淆两者。

EXT_disjoint_timer_query规范的示例似乎已从ARB_timer_query中错误地复制。

相关问题