【发布时间】:2014-06-27 03:22:07
【问题描述】:
我注意到调用一些 openGL 函数时会慢 15 毫秒。经过一些测试,我确实相信我缩小了问题的范围。我确实有几个 MBytes 的缓冲区(主要包含粒子)。有时我确实需要添加一些粒子。为此,我绑定缓冲区,获取当前粒子数以了解要写入的偏移量,然后写入粒子。正如预期的那样,放缓是在阅读部分。 (对于这个问题,假设在 CPU 端跟踪粒子数量是不可能的。)
glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
GLvoid* rangePtr = glMapBufferRange( //This function takes 15ms to return
GL_ARRAY_BUFFER,
m_offsetToCounter,
sizeof(GLuint),
1);
if(rangePtr != NULL)
value = *(GLuint*) rangePtr;
m_functions->glBindBuffer(GL_ARRAY_BUFFER, 0);
我假设通过提供一个非常有限的大小(这里是一个 GLuint),只会下载一个 GLuint。但是,通过将缓冲区的大小大幅减少到 200 KB,函数的执行时间会下降到 8 毫秒。
两个问题:
-
glMapBufferRange和glGetBufferSubData是否会下载完整的缓冲区,即使用户只要求其中的一部分? - 数学不加起来,知道为什么吗?下载一个非常小的缓冲区还有 8 毫秒。执行时间方程看起来像 y = ax + b 其中 b 是 7-8 ms。当我在怀疑缓冲区大小之前试图找到问题的根源时,我还发现
glUniform*函数也需要大约 10 毫秒。但只是第一次打电话。如果有多个glUniform*一个接一个地调用,那么只有第一个会花费很多时间。其他都是瞬时的。并且当缓冲区将在读取中被访问时,也没有下载时间。glUniform*触发了什么?
我正在使用 Qt 5 API。我想首先确定我正确使用了 openGL,然后才考虑可能是 Qt 的层导致速度变慢并使用 glu/glut 重新实现整个程序。
【问题讨论】:
-
glMapBufferRange的最后一个参数应该是一个符号常量。你为什么传入1而不是GL_MAP_READ_BIT? -
不幸的是,
GL_MAP_READ_BIT没有在 Qt 5.2 OpenGL 模块中定义。我必须提供原始价值。但这不是这里的主题。
标签: opengl optimization buffer