我的C ++程序的内存非常缓慢地增加,然后在达到某个点(60MB)后一段时间(几分钟)后,它减少了~12 MB。在我的程序运行时,这会无限期地重复。这本身就是一个问题吗?
这似乎与我每帧多次调用的OpenGL相关功能有关,因为每帧调用更多次会使内存增加更快,并在达到60MB后再次减少。我不确定这是否算作泄漏,我也不确定是否有足够的时间,内存将慢慢达到60MB以上,因为我在检查此问题时运行它,一次最多10分钟。
// vertices is just a GLfloat[] and the only other part of the function
glBindVertexArray(this->vao);
glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW); // i believe it is this line
glBindVertexArray(0);
答案 0 :(得分:3)
glBufferData()实际上并没有在大多数驱动程序中立即将数据上传到GPU,操作被放入队列并最终被刷新。
为了使其工作,驱动程序必须复制顶点,因为它无法知道数据在刷新命令队列时是否仍然存在。
除此之外,OpenGL驱动程序使用的内存策略将决定内存释放/重用的方式和时间,因此您看到的行为不一定是问题。
这是假设您的代码中没有额外的内存泄漏,因为我们无法看到如何分配顶点。
答案 1 :(得分:0)
您不必在每次绘制调用期间传输顶点数据。 glBufferData()只能为VBO调用一次。稍后,当您想将它绑定到顶点数组或顶点属性时,只需绑定相应的VBO。