我在这里有一些大绩效问题
所以我想在GPU方面进行一些测量。
通过读取此线程,我围绕着绘制功能编写了此代码,包括GL错误检查和SwapBuffers()(自动交换确实被禁用)
gl4.glBeginQuery(GL4.GL_TIME_ELAPSED, queryId[0]);
{
draw(gl4);
checkGlError(gl4);
glad.swapBuffers();
}
gl4.glEndQuery(GL4.GL_TIME_ELAPSED);
gl4.glGetQueryObjectiv(queryId[0], GL4.GL_QUERY_RESULT, frameGpuTime, 0);
,并且由于OpenGL渲染命令应该是异步的(驱动程序可以在一批发送一起将它们一起发送在一起之前,然后将它们全部发送到x命令),我的问题本质上是:
上面的代码正确
我是正确的,假设在新帧开始时,所有先前的GL命令(从上一个帧)已发送,执行和终止在GPU
上我是正确的,假设当我获得
glGetQueryObjectiv
和GL_QUERY_RESULT
查询结果时,到目前为止,所有GL命令都已终止?那就是OpenGl等到结果可用(从线程)?
是的,当您查询计时器时,它将阻止直到数据可用,即直到GPU完成在开始和结束查询之间发生的一切。为避免与GPU同步,您可以使用GL_QUERY_RESULT_AVAILABLE
检查结果是否已可用,然后然后读取它们。这可能需要较少的直接代码来保留打开查询并定期检查它们的标签,但性能影响最少。每次等待价值是杀死您的性能的肯定方法。
编辑:要解决您的第二个问题,请交换缓冲区并不一定意味着它会在操作成功之前阻止。您可能会看到这种行为,但是它只是隐含的glFlush
,命令缓冲区还没有空。这也是更想要的行为,因为理想情况下,您想立即从下一个帧开始,并保持CPU命令缓冲区。但是,请检查实现文档以获取更多信息,因为已定义了实现。
编辑2:检查错误可能最终是一个隐式同步,因此在等待错误检查命令流中的错误时,您可能会看到命令缓冲区空的。