我需要测量计算着色器的时间。但当然这不是微不足道的。 从OpenGL Wiki - Performance开始,在着色器调用之前和之后使用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,但我不确定它是如何工作的,也不知道它是否对我有用。这些东西对我来说是新的,我不确定我是否完全理解它。
来自here的回答说,几乎不可能精确地测量代码的一部分。最好的方法是测量帧渲染时间,但我只需要帧渲染时间的计算着色器部分用于我的目的。
您认为最好的选择是什么?只测量整个帧渲染时间并使用它?或者您是否使用其他测量方法获得了更好的体验?
答案 0 :(得分:6)
计时器查询肯定是要走的路。
一般原则是您创建在GL函数调用之间插入的“查询对象”。
当GPU异步运行时,这些查询将插入GPU命令队列中,并在命令真正处理后“填充”。
因此,在您的情况下,您需要使用glGenQueries(1, &myQuery);
然后,您不是启动计时器,而是使用glBeginQuery(GL_TIME_ELAPSED, myQuery)
在(2)中启动查询,并使用glEndQuery(GL_TIME_ELAPSED)
在(3)中“停止”。
要获得结果,您只需拨打glGetQueryObject
功能。
您可以在此处了解更多信息,例如:http://www.lighthouse3d.com/tutorials/opengl-short-tutorials/opengl-timer-query/
当然,有一些'陷阱' - 主要的是你必须等待时间结果准备就绪 - 所以你可以选择GPU& CPU要同步,这会降低您的应用程序速度(但仍然可以提供良好的GL计时),或者在飞行中有多个查询。