OpenGL不会释放显示列表内存

时间:2011-10-12 04:41:37

标签: memory-management opengl memory-leaks

我有一个显示静态场景的OpenGL应用程序。该场景由大约150k个多边形组成。由于有很多多边形,并且因为它是静态场景,所以我决定使用显示列表来存储所有多边形。当应用程序仍在运行时,可以“重新生成”场景。

我的问题是OpenGL似乎没有释放它为列表分配的任何内存。

这是我创建列表的地方:

m_displayList = glGenLists(1);
m_polygons = m_generator->polygons(scene_name);

glNewList(m_displayList, GL_COMPILE);

for(int i = 0; i < m_polygons.size(); i++)
{       
    glBegin(GL_POLYGON);
    glNormal3fv(m_polygons[i]->get_normal());

    for(int j = 0; j < 4; j++)
    {
        glColor3fv(m_polygons[i]->get_colors()[j]);
        glVertex3fv(m_polygons[i]->get_vertices()[j]);
    }

    glEnd();
}
glEndList();

稍后,当我想重新生成场景时,我称之为:

glDeleteLists(m_displayList, 1);

那应该照顾为列表分配的所有内存OpenGL,对吗?据我所知,事实并非如此。当我生成场景时,我的内存使用量增加了大约600 Mb,当我重新生成时,它只下降大约30 Mb,然后再增加600 Mb。我想也许OpenGL只是懒得删除它,但我可以生成场景,直到我点击交换,没有任何东西被释放。

我知道我的其他应用程序使用不多。 “生成器”类只使用大约30 Mb(当我重新生成场景时,这就是取消分配的内容)。

无论如何,我不知道我做错了什么。

2 个答案:

答案 0 :(得分:3)

这将释放为列表分配的内存OpenGL。但它不会释放你分配的任何记忆。

我不知道m_generator->polygons(scene_name);是如何工作的,但似乎“生成器”可能会分配内存来保存生成的数据。所以检查一下你是否应该释放它。

答案 1 :(得分:0)

600 MB听起来像是很多内存,只是在猜测,但从我看到的情况来看,150k多媒体应该只占用大约20 MB的内存。当您为所有这些多边形创建一个显示列表时,所有数据都必须复制到显示列表中,这样至少还需要20 MB以及其他内容。

查看您的分配并查看是否有任何过度分配可能是个好主意。只是我的想法。