在 C++ 和 OpenGL 中非常缓慢地增加和重置内存? (VS 调试器)

Very slowly increasing & resetting memory in C++ and OpenGL? (VS Debugger)

我的 C++ 程序的内存增加非常缓慢,然后在达到某个点 (60MB) 一段时间后(几分钟)它减少了 ~12 MB。当我的程序 运行ning 时,这会无限期地重复。这本身就是一个问题吗?

这似乎与我每帧调用多次的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);

glBufferData() 在大多数驱动程序中实际上不会立即将数据上传到 GPU,操作会被放入队列并最终被刷新。

为了让它工作,驱动程序必须复制你的顶点,因为它无法知道在它的命令队列被刷新时数据是否仍然存在。

除此之外,OpenGL 驱动程序使用的任何内存策略都将决定内存获取的方式和时间 released/reused,因此您看到的行为不一定是问题。

这一切都是假设您的代码中没有额外的内存泄漏,因为我们看不到顶点是如何分配的。

您不必在每次绘制调用期间都传输顶点数据。对于 VBO,glBufferData() 应该只调用一次。以后想绑定到顶点数组或者顶点属性的时候直接绑定对应的VBO即可。