glDeleteBuffers медленнее, чем glBufferData

У меня есть небольшая проблема с производительностью в моей игре для iOS / Android, где необходимо периодически обновлять несколько VBO. После профилирования моей игры выясняется, что glDeleteBuffers () занимает до 7 мс на обновление VBO. Это, конечно, приводит к сбоям в работе, когда для рендеринга кадров обычно требуется всего 4 мс.

Вот часть, где я обновляю свой VBO:

Chunk* chunk;
pthread_join(constructionThread, (void**)&chunk);
building = false;

if (vboID)
{
    //takes 7 milliseconds
    glDeleteBuffers(1, &vboID); 
    vboID = 0;
}
if (offset)
{
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);

    //takes about 1-2 milliseconds, which is acceptable
    glBufferData(GL_ARRAY_BUFFER, offset * 4, constructionBuffer, GL_STATIC_DRAW);
}

где смещение - это переменная экземпляра, в основном размер нового VBO, который довольно переменный. я думаю, vboID говорит сам за себя;)

 Brammie26 мая 2012 г., 21:16
потому что они все равно будут разного размера. Я думал о них как о регулярных массивах.
 harold26 мая 2012 г., 21:03
Зачем удалять их, если вы просто собираетесь их воссоздать?

Ответы на вопрос(1)

Решение Вопроса

glGenBuffers а такжеglDeleteBuffers предназначены для запуска только при инициализации и очистке, соответственно. Вызывать их во время выполнения плохо.

glBufferData заменяет текущие данные буфера новым набором данных, который автоматически изменяет размер буфера. Вы можете безопасно удалить весьglGenBuffers/glDeleteBuffers вещь и переместить его в инициализацию и очистку.

Кроме того, вы создаете буфер как статический буфер. Это говорит OpenGL, что вы почти никогда не будете изменять его, поэтому он хранит его таким образом, чтобы быстрее получать доступ к графическому процессору, но медленнее получать доступ из остальной системы. Попробуйте изменитьGL_STATIC_DRAW вGL_DYNAMIC_DRAW или жеGL_STREAM_DRAW, Подробнее об этом здесь:http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage

 26 мая 2012 г., 21:29
Он упомянул, чтоglBufferData заняло 1-2 мс, изменение подсказки использования может ускорить его совсем немного. ИCOPY Подсказка используется для данных, сгенерированных графическим процессором, которые пользователь никогда не читает напрямую.
 27 мая 2012 г., 06:59
@ Николас: ты прав, как обычно. Сейчас у меня есть lapsus, но, к счастью, мой уровень абстракции, реализованный несколько лет назад, был верным ... Не так уж плохо
 26 мая 2012 г., 21:17
GL_DYNAMIC_DRAW используется, когда содержимое буфера генерируется на GPU, и используется для рисования: это не похоже на вопрос.
 Brammie26 мая 2012 г., 21:16
Спасибо! Работает отлично сейчас.
 26 мая 2012 г., 21:47
@Luca: STATIC / DYNAMIC / STREAM оfrequency изменений, а не откуда приходит контент.

Ваш ответ на вопрос