OpenGL не освобождает память списка отображения - PullRequest
0 голосов
/ 12 октября 2011

У меня есть приложение OpenGL, которое отображает статическую сцену. Эта сцена состоит из около 150 тысяч полигонов. Поскольку полигонов так много, и поскольку это статическая сцена, я решил использовать список отображения для хранения всех полигонов. Можно «регенерировать» сцену, пока приложение еще работает.

Моя проблема в том, что 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 МБ, а когда я регенерирую, оно падает только примерно на 30 МБ, а затем увеличивается до 600 МБ. Я подумал, что, возможно, OpenGL просто ленился удалить его, но я могу генерировать сцены, пока не доберусь до свопа, и ничто так и не освободится.

Я знаю, что остальная часть моего приложения не использует много. Класс «генератора» использует только около 30 Мб (это то, что освобождается, когда я восстанавливаю сцену).

Во всяком случае, я понятия не имею, что я делаю неправильно.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Это освободит память OpenGL, выделенную для списка.Но это не освободит память, которую ВЫ выделяете.

Я не знаю, как работает m_generator->polygons(scene_name);, но вполне вероятно, что «генератор» может выделить память для хранения сгенерированных данных.Так что проверь, должен ли ты это освободить.

0 голосов
/ 12 октября 2011

600 МБ звучит как много памяти, просто догадываюсь, но из того, что я вижу, 150 тыс. Полисов должны занимать только около 20 МБ в памяти.Когда вы создаете список отображения для всех этих полисов, все данные должны быть скопированы в список отображения, так что это должно быть еще как минимум 20 МБ плюс другие данные.распределения и посмотреть, если что-то перераспределяется.Только мои мысли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...