2012-05-26 3 views
3

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

Вот та часть, где я обновить мою 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 говорит сам за себя, я думаю;)

+0

Зачем их удалять, если вы собираетесь их воссоздать? – harold

+1

, потому что они все равно будут разных размеров. Я думал о них как о регулярных массивах. – Brammie

ответ

6

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

+0

Спасибо! Сейчас работает отлично. – Brammie

+0

GL_DYNAMIC_DRAW используется, когда содержимое буфера генерируется на графическом процессоре и используется для рисования: это не похоже на вопрос. – Luca

+0

Он упомянул, что 'glBufferData' занял 1-2 мс, изменение подсказки использования может ускорить его. И подсказка 'COPY' используется для генерируемых GPU данных, которые пользователь никогда не читает напрямую. –

Смежные вопросы