内存泄漏OpenGL渲染

时间:2015-08-04 16:14:38

标签: c++ opengl memory-leaks point-clouds

我正在开发一个使用OpenGL渲染点云的应用程序。 每次迭代时点的数量都会发生变化。 这是我使用的代码:

        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);

        glColorPointer(3, GL_UNSIGNED_BYTE, 0, cloud->colors.data());
        glVertexPointer(3, GL_FLOAT,    0, p_cloud->vertices.data());
        glDrawArrays(GL_POINTS, 0, p_cloud->vertices.size());

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);

事情是,只有当我像这样使用它时才会出现内存泄漏。如果我评论上一节它运作良好(但当然没有显示)。

之后是否有调用函数?

另一个问题:是否有一种简单的方法将其显示为网格? 我知道三角形的索引。

1 个答案:

答案 0 :(得分:2)

您发布的代码片段天真地假设所涉及的唯一内存是p_cloud内的数组/向量的内存。

然而,现代OpenGL实现以异步方式运行。 OTOH你得到保证,glDraw…返回后指向的内存是安全的解除分配。这意味着OpenGL实现必须创建一个卷影副本(并且由于GPU内存不是“持久的”,这会在您的进程的地址空间中发生,以方便驱动程序。)

通常这个卷影副本最终会被垃圾收集,但是如果你的程序在发生之前终止,你就会看到内存泄漏。通常,当与它交互的最后一个OpenGL上下文被破坏时,应该释放所有卷影副本。

尝试在终止进程之前正确拆除OpenGL上下文时会发生什么。 (如果你正在使用GLUT,GLFW或类似的,这可能需要入侵那些的源代码)。