glDeleteBuffers slower than glBufferData

c++, opengl-es

Solution

`glGenBuffers` and `glDeleteBuffers` are designed to only be run on initialization and cleanup, respectively. Calling them during runtime is bad.

`glBufferData` replaces the current buffer data with a new set of data, which automatically changes the size of the buffer. You can safely remove the whole `glGenBuffers`/`glDeleteBuffers` thing and move it into initialization and cleanup.

Additionally, you are creating the buffer as a static buffer. This is telling OpenGL that you will almost never change it so it stores it in a way that's quicker to access on the GPU but slower to access from the rest of the system. Try changing `GL_STATIC_DRAW` to `GL_DYNAMIC_DRAW` or `GL_STREAM_DRAW`. More on this here: http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage

Problem

I'm having a bit of performance issue in my iOS/Android game where several VBO's have to be updated every once in a while. After profiling my game it turns out that glDeleteBuffers() takes up to 7ms per VBO update. This of course results in a hiccup when frames normally take only 4 ms to render. Here's the part where I update my 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); } ``` where offset is an instance variable is basically the size of the new VBO, which is quite variable. vboID speaks for itself, I guess ;)

Original source