He estado trabajando en tratar de optimizar mi núcleo libretro, porque ahora mismo en consolas portátiles (como mi Anbernic) algunos juegos se pueden ralentizar. Pero ha pasado algo extraño que no soy capaz de resolver. Lo escribo aquí por si alguien sabe lo que pasa.
Estoy usando OpenGL ES 3 bajo Android. De momento el núcleo de Vircon32 funciona básicamente dibujando quads con textura de uno en uno. Para ello estoy usando 2 Vertex Buffers (VBOs): uno para las posiciones de los vértices y otro para las coordenadas de las texturas. Si defino estos buffers con el tamaño necesario para dibujar un quad, la definición de cada VBO queda así:
// reservar memoria en la GPU para el VBO
glBindBuffer( GL_ARRAY_BUFFER, VBOPositions );
glBufferData
(
GL_ARRAY_BUFFER,
8 * sizeof( GLfloat ),
QuadPositionCoords,
GL_DYNAMIC_DRAW
);
// definir el formato para las posiciones de vertices
glVertexAttribPointer
(
PositionsLocation, // location (0-based index) within the shader program
2, // 2 components per vertex (x,y)
GL_FLOAT, // each component is of type GLfloat
GL_FALSE, // do not normalize values (convert directly to fixed-point)
0, // no gap between values (adjacent in memory)
nullptr // pointer to the array
);
glEnableVertexAttribArray( PositionsLocation );
Después los buffers se modifican usando glBufferSubData cuando es necesario y todo funciona bien.
Sin embargo, si trato de reservar más espacio en esos VBOs (por ejemplo cambiando ambos buffers a 20 * 8 * sizeof(GLfloat)) ¡ahora los juegos se ralentizan! Y tened en cuenta que ese ha sido el ÚNICO cambio. El tamaño extra no lo he usado todavía, y esto no es ni siquiera un tamaño muy grande para un buffer de OpenGL. Llevo horas intentando ver lo que pasa, así que si alguien tiene una idea, toda ayuda es bienvenida.