#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 именно поэтому я предложил пойти тем же путем, который (по-видимому) был проделан с шейдером: создавать при первом использовании и сохранять для повторного использования при каждом вызове. Спасибо за подтверждение.