Утечка памяти при рисовании линий в OpenGL3

#c #opengl #opengl-3

Вопрос:

У меня возникли некоторые проблемы с утечкой памяти с моей функцией рисования линий. Я использую диспетчер задач Windows, чтобы увидеть, что есть проблема. Когда я запускаю приложение, оно использует около 200 МБ, а после запуска в течение примерно 10 минут оно использует около 10 ГБ (останавливается, когда я перестаю рисовать линии).

Моя функция рисования линий выглядит примерно так:

 static unsigned int buffer;
void drawLine(float x1, float y1, float x2, float y2, float r, float g, float b, float a)
{
    x1 = pixToPointWidth(x1, width);
    y1 = pixToPointHeight(y1, height);
    x2 = pixToPointWidth(x2, width);
    y2 = pixToPointHeight(y2, height);

    float pos[12] = {
        x1, y1, r, g, b, a,
        x2, y2, r, g, b, a
    };

    glGenBuffers(1, amp;buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(pos), pos, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0);

    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (const void*)8);

    if (!createdShader)
    {
        createShader();
    }

    glUseProgram(shader);
    glDrawArrays(GL_LINES, 0, 2);
}
 

Он вызывается в цикле while(true) с 1 мс сна.

Комментарии:

1.По общему признанию, ни черта не зная об OpenGL, я бы счел необычным, если бы этот glGenBuffers вызов в конечном счете не требовал glDeleteBuffers где-то спаривания . Если вы систематически создаете шейдер только по первому запросу, по какой-либо конкретной причине вы не делаете то же самое со своими буферами?

2. Похоже, это то, что мне было нужно. Я не знал об этом. Спасибо! Глядя на это сейчас, он просто колеблется — 20 МБ 🙂 Я надеюсь, что это правильный способ сделать это. Просто добавлено glDeleteBuffers(1, amp;buffer); после glDrawArrays(GL_LINES, 0, 2);

3. @MegaMagnum Если это просто тест, то все в порядке, но обычно вы не должны создавать и удалять буферы на каждом кадре. Это крайне неэффективно. Настройте их в начале, а затем повторно используйте в каждом кадре.

4. @MichaelMahn именно поэтому я предложил пойти тем же путем, который (по-видимому) был проделан с шейдером: создавать при первом использовании и сохранять для повторного использования при каждом вызове. Спасибо за подтверждение.