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