我有一个显示静态场景的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(当我重新生成场景时,这就是取消分配的内容)。
无论如何,我不知道我做错了什么。
答案 0 :(得分:3)
这将释放为列表分配的内存OpenGL。但它不会释放你分配的任何记忆。
我不知道m_generator->polygons(scene_name);
是如何工作的,但似乎“生成器”可能会分配内存来保存生成的数据。所以检查一下你是否应该释放它。
答案 1 :(得分:0)
600 MB听起来像是很多内存,只是在猜测,但从我看到的情况来看,150k多媒体应该只占用大约20 MB的内存。当您为所有这些多边形创建一个显示列表时,所有数据都必须复制到显示列表中,这样至少还需要20 MB以及其他内容。
查看您的分配并查看是否有任何过度分配可能是个好主意。只是我的想法。