Dan*_*gel 4 c++ opengl performance compute-shader
我需要测量计算着色器的时间.但当然这不是微不足道的.从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
}
Run Code Online (Sandbox Code Playgroud)
我想我必须插入glFinish()位置(1)并启动计时器(2)并将其停在(3).但我不确定它是否真的有效并且会产生正确的计时结果,因为在参考中他们谈论的是渲染而计算着色器不能渲染,不是吗?
还存在OpenGL Timer_Query,但我不确定它是如何工作的,也不知道它是否对我有用.这些东西对我来说是新的,我不确定我是否完全理解它.
这里的答案说,几乎不可能精确地测量代码的一部分.最好的方法是测量帧渲染时间,但我只需要帧渲染时间的计算着色器部分用于我的目的.
您认为最好的替代方案是什么?只测量整个帧渲染时间并使用它?或者您是否使用其他测量方法获得了更好的体验?
定时器查询肯定是要走的路.
一般原则是您创建在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时间),或在飞行中有多个查询.