Утечки памяти рендеринга OpenGL

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

        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);

Дело в том, что я получаю утечку памяти, только если я использую это так. Если я прокомментирую предыдущий раздел, он работает хорошо (но без отображения, конечно).

Есть ли функция для вызова после этого?

Другой вопрос: есть ли простой способ отобразить его в виде сетки? Я знаю индекс треугольников.

1 ответ

Фрагмент кода, который вы разместили, наивно предполагал, что единственная задействованная память - это память массивов / векторов внутри p_cloud,

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

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

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

Другие вопросы по тегам