Программа OpenGL время от времени лагает

#c #opengl

#c #opengl

Вопрос:

Я использую C с SDL 2, OpenGL 3.3, Windows 8. Всякий раз, когда я запускаю свою программу, время, необходимое для рисования каждого кадра, обычно < 1 ms составляет, поскольку я рисую всего несколько сотен квадратов. Это пакетный рисунок, и все они имеют одинаковую текстуру. Я не запрашиваю графический процессор. Я пробовал вызывать glFlush() в конце каждого кадра. Но время от времени время, необходимое для рисования, внезапно увеличивается 3-5 ms . Иногда она достигает даже 30 мс. Что я могу сделать, чтобы исправить это?

 void XL::SpriteBatch::render()
{
    generateElements();

    glBufferSubData(GL_ARRAY_BUFFER, 0, vertexCount * 8 * sizeof(vertexBuffer[0]), vertexBuffer.data());
    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, ebOffset * sizeof(elementBuffer[0]), elementBuffer.data());

    glDrawElements(GL_TRIANGLES, vertexCount / 4 * 6, GL_UNSIGNED_INT, 0);

    vertexBuffer.clear();
    elementBuffer.clear();
    vertexCount = 0;
    ebOffset = 0;
}
  

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

1. Невозможно сказать, не видя никакого кода или анализа производительности!

2. Привет. Я отредактировал код. Это очень просто, и я уверен, что ошибка не кроется где-либо еще, поскольку я очень тщательно тестировал. Это вызовы glBufferSubData и glDrawElements, которые иногда занимают больше времени, чем обычно.

3. bufferSubData запускает точку синхронизации, поскольку конвейер может извлекать данные из буфера, который вы в данный момент заменяете. Рассмотрите возможность использования двух буферов и переключения их между кадрами, подобно тому, как это делает двойная буферизация дисплея.

4. Ах, так что мне пришлось бы создать два вершинных буфера и два буфера элементов, правильно?

5. По крайней мере, две пары буферов, да. И, конечно, следите за размером буфера, вы не можете его переполнить. В идеале данные буфера должны быть статическими, но я полагаю, что в случае спрайтов это не очень удобно.