#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. По крайней мере, две пары буферов, да. И, конечно, следите за размером буфера, вы не можете его переполнить. В идеале данные буфера должны быть статическими, но я полагаю, что в случае спрайтов это не очень удобно.