standard page original opengl4 open library c++ opengl-es

c++ - page - glDeleteBuffers más lento que glBufferData



opengl web page (1)

Tengo un problema de rendimiento en mi juego iOS / Android donde varias VBO deben actualizarse de vez en cuando. Después de perfilar mi juego, resulta que glDeleteBuffers () toma hasta 7ms por actualización de VBO. Esto, por supuesto, produce un tropiezo cuando los marcos normalmente tardan solo 4 ms en renderizarse.

Aquí está la parte donde actualizo mi 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); }

donde offset es una variable de instancia es básicamente el tamaño de la nueva VBO, que es bastante variable. vboID habla por sí mismo, supongo;)


glGenBuffers y glDeleteBuffers están diseñados solo para ejecutarse en la inicialización y limpieza, respectivamente. Llamarlos durante el tiempo de ejecución es malo.

glBufferData reemplaza los datos del búfer actual con un nuevo conjunto de datos, que cambia automáticamente el tamaño del búfer. Puede eliminar de forma segura todo lo relacionado con glGenBuffers / glDeleteBuffers y moverlo a la inicialización y la limpieza.

Además, está creando el búfer como un búfer estático. Esto le dice a OpenGL que casi nunca lo cambiará, así que lo almacena de una forma que es más rápida de acceder en la GPU, pero más lenta de acceder desde el resto del sistema. Intenta cambiar GL_STATIC_DRAW por GL_DYNAMIC_DRAW o GL_STREAM_DRAW . Más sobre esto aquí: http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage