我正在开发一个使用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);
事情是,只有当我像这样使用它时才会出现内存泄漏。如果我评论上一节它运作良好(但当然没有显示)。
之后是否有调用函数?
另一个问题:是否有一种简单的方法将其显示为网格? 我知道三角形的索引。
答案 0 :(得分:2)
您发布的代码片段天真地假设所涉及的唯一内存是p_cloud
内的数组/向量的内存。
然而,现代OpenGL实现以异步方式运行。 OTOH你得到保证,glDraw…
返回后指向的内存是安全的解除分配。这意味着OpenGL实现必须创建一个卷影副本(并且由于GPU内存不是“持久的”,这会在您的进程的地址空间中发生,以方便驱动程序。)
通常这个卷影副本最终会被垃圾收集,但是如果你的程序在发生之前终止,你就会看到内存泄漏。通常,当与它交互的最后一个OpenGL上下文被破坏时,应该释放所有卷影副本。
尝试在终止进程之前正确拆除OpenGL上下文时会发生什么。 (如果你正在使用GLUT,GLFW或类似的,这可能需要入侵那些的源代码)。