2011-10-12 2 views
0

정적 장면을 표시하는 OpenGL 앱이 있습니다. 이 장면은 약 150k 다각형으로 구성됩니다. 폴리곤이 너무 많고 정적 인 장면이므로 모든 폴리곤을 저장하기 위해 디스플레이 목록을 사용하기로 결정했습니다. 앱이 실행되는 동안 장면을 '재생성'할 수 있습니다.OpenGL에서 디스플레이 목록 메모리를 할당 해제하지 않습니다.

제 문제는 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(); 

을 나는 장면을 다시 생성 할 때, 나는이 전화 : 모든 메모리는 OpenGL의주의를 기울여야한다

glDeleteLists(m_displayList, 1); 

목록에 대해 할당 된, 맞습니까? 내가 말할 수있는 한, 그것은 아닙니다. 장면을 생성 할 때 메모리 사용량은 약 600Mb 씩 증가하고 다시 재생하면 약 600Mb를 떨어 뜨리기 전에 약 30Mb 만 떨어 뜨립니다. 아마도 OpenGL은 삭제하는 게으른 게 아니라고 생각했지만 스왑을 치기 전까지는 장면을 생성 할 수 있으며 아무 것도 해제되지 않습니다.

내 응용 프로그램의 나머지 부분은 많이 사용하지 않는다는 것을 알고 있습니다. "생성기"클래스는 약 30Mb 만 사용합니다 (장면을 재생성 할 때 할당이 해제됩니다).

어쨌든 내가 뭘 잘못하고 있는지 전혀 모르겠다.

답변

3

이렇게하면 목록에 할당 된 OpenGL 메모리가 해제됩니다. 그러나 당신이 할당 한 어떤 기억든지 해방하지 않을 것이다.

나는 m_generator->polygons(scene_name);이 어떻게 작동하는지 모르지만 "생성기"가 생성 된 데이터를 보유하기 위해 메모리를 할당 할 가능성이 높습니다. 그러니 그걸 풀어 주는지 확인하십시오.

+0

+1. Valgrind는 어느 할당이 해제되지 않았는지 확인하는 데 도움이 될 수 있습니다. – neodelphi

0

600MB의 메모리가 많은 것처럼 들리지만 150k 폴리곤이 메모리에서 약 20MB 만 차지한다는 것을 알 수 있습니다. 이러한 모든 polys에 대한 표시 목록을 만들 때 모든 데이터를 표시 목록에 복사해야합니다. 그래야 최소한 20MB가 넘는 다른 자료도 복사됩니다.

할당량을 살펴보고 할당량 초과가 있는지 확인하는 것이 좋습니다. 그냥 내 생각.

관련 문제