4

我需要测量计算着色器的时间。但这当然不是微不足道的。从OpenGL Wiki -我得到的性能,在着色器调用之前和之后使用 glFinish() 很有用。但他们也说使用它不是很好。是否有可能测量我的着色器的时间?无论如何有可能测量计算着色器的时间吗?

我的代码看起来像这样:

renderloop()
{
  //(1)
  //(2)
  if(updateFunction) //this is done just one time at the beginning
  {
    //update Texture with a compute shader
    //...
    glDispatchCompute();
    glMemoryBarrier(GL_ALL_BARRIER_BITS);
  }
  //(3)
  //(1)

  //use the texture to do some marching cubes rendering
}

我想我必须glFinish()在位置插入并在 处(1)启动计时器(2)并在 处停止它(3)。但我不确定它是否真的有效并且会产生正确的计时结果,因为在参考中他们正在谈论渲染并且计算着色器不是渲染,不是吗?

OpenGL Timer_Query也存在,但我不确定它是如何工作的,也不知道它是否对我有用。这些东西对我来说是新的,我不确定我现在是否完全理解它。

这里的答案说,几乎不可能精确测量代码的一部分。最好的方法是测量帧渲染时间,但我只需要计算着色器部分的帧渲染时间就可以了。

你认为最好的选择是什么?只是测量整个帧渲染时间并使用它?或者您是否使用其他测量方法获得了更好的体验?

4

1 回答 1

7

定时器查询绝对是要走的路。

一般原则是您创建在您的 GL 函数调用之间插入的“查询对象”。

由于 GPU 异步运行,这些查询将被插入到 GPU 命令队列中,并在真正处理命令时“填充”。

因此,在您的情况下,您需要创建一个查询,例如,glGenQueries(1, &myQuery);

然后,不是启动计时器,而是在 (2) 中使用 开始查询glBeginQuery(GL_TIME_ELAPSED, myQuery),并在 (3) 中使用 '停止'它glEndQuery(GL_TIME_ELAPSED)

要获得结果,您可以简单地调用glGetQueryObject函数。

您可以在这里了解更多信息,例如:http ://www.lighthouse3d.com/tutorials/opengl-short-tutorials/opengl-timer-query/

当然,有一些“陷阱”——主要是你必须等待计时结果准备好——所以你可以让 GPU 和 CPU 同步,这会减慢你的应用程序(但仍然会给你良好的 GL 时间),或者正在进行多个查询。

于 2015-01-27T22:50:11.287 回答