2015-08-04 3 views
0

Я разрабатываю приложение, использующее OpenGL для визуализации облака точек. Число точек изменяется на каждой итерации. Вот код, который я использую:утечки памяти OpenGL render

 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

Один вопрос на вопрос, пожалуйста. Предпочтительно тот, который имеет смысл. –

+0

@LightnessRacesinOrbit: Прекрасно тонкий вопрос. – datenwolf

+0

Чтобы убедиться, что вы правильно поставили диагноз: если вы используете этот код в течение длительного периода времени, увеличивается ли объем памяти? Более или менее линейно со временем? Или использование памяти просто несколько увеличивается несколько раз, когда вы выполняете этот код, а затем плато? –

ответ

2

Выделенный фрагмент кода наивно предполагал, что единственная память связана с массивами/векторами в пределах p_cloud.

Однако современные реализации OpenGL работают асинхронно. OTOH вы получаете гарантию, что после того, как glDraw… вернет указанную память, можно безопасно освободить. Это означает, что реализация OpenGL должна создать теневую копию (и поскольку память GPU не является «постоянной», это происходит в адресном пространстве вашего процесса для удобства драйвера).

Обычно эта теневая копия в конечном итоге собирает мусор, но если ваша программа завершается до того, как это произойдет, вы увидите утечку памяти. Обычно все теневые копии должны быть освобождены, когда последний контекст OpenGL, который взаимодействует с ним, будет уничтожен.

Проверьте, что произойдет, если вы правильно разорвали контекст OpenGL перед завершением процесса. (Если вы используете GLUT, GLFW или подобное, это может потребовать взломать исходный код этих).

+0

Действительно, единственная память связана с p_cloud. На данный момент я замедляю функцию рендеринга, пока не получу правильное решение. Я постараюсь выяснить, что произошло позже, и дайте знать. Спасибо – PeWhy

Смежные вопросы