gpt4 book ai didi

OpenGL,测量 GPU 上的渲染时间

转载 作者:行者123 更新时间:2023-12-02 08:58:58 32 4
gpt4 key购买 nike

我遇到一些严重的性能问题 here

所以我想在 GPU 端进行一些测量。

通过阅读本文thread我围绕我的绘图函数编写了这段代码,包括 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 渲染命令应该是 asynchronous (驱动程序可以在批量发送所有命令之前缓冲最多 X 个命令),我的问题本质上是:

  • 上面的代码是正确的

  • 我正确地假设,在新帧开始时,所有先前的 GL 命令(来自前一帧)都已在 GPU 上发送、执行和终止

  • 我正确地假设,当我使用 glGetQueryObjectivGL_QUERY_RESULT 获取查询结果时,到目前为止所有 GL 命令都已终止?也就是说 OpenGL 将等待直到结果可用(从线程)?

最佳答案

是的,当您查询计时器时,它会阻塞,直到数据可用为止,即直到 GPU 完成查询开始和结束之间发生的所有事情。为了避免与 GPU 同步,您可以使用 GL_QUERY_RESULT_AVAILABLE 来检查结果是否已经可用,然后再读取它们。这可能需要不太简单的代码来密切关注打开的查询并定期检查它们,但对性能的影响最小。每次都等待该值肯定会毁掉你的性能。

编辑:为了解决你的第二个问题,交换缓冲区并不一定意味着它会阻塞,直到操作成功。您可能会看到这种行为,但它很可能只是隐式的 glFlush 并且命令缓冲区尚未为空。这也是更想要的行为,因为理想情况下您希望立即开始下一帧并保持 CPU 命令缓冲区已填充。不过,请检查实现文档以获取更多信息,因为这是实现定义的。

编辑 2:顺便说一下,检查错误可能最终会成为隐式同步,因此当您在命令流中等待错误检查时,您可能会看到命令缓冲区清空。

关于OpenGL,测量 GPU 上的渲染时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104982/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com