J'ai une application iPad avec interface utilisateur écrite en OpenGL ES 2.0, certains éléments de l'interface utilisateur sont cachés par défaut et quand j'ai besoin de les montrer il y a assez de retard avant qu'ils ne soient réellement affichés (à propos 300-500 ms sur un contrôle qui contient environ 20 autres contrôles à l'intérieur), en utilisant Instruments.app J'ai déterminé que quand je rends chaque objet unique, il faut beaucoup plus de temps pour le rendre la première fois après qu'il ait été rendu au moins une fois en rendant le temps est énorme. Voici le code que j'ai pour le rendu et ce code est illustré par des instruments prenant tout ce retard:premier appel à glDrawArrays est très lent sur iPad
- (void)render:(id <ESRenderer>)renderer
{
[shader useShader];
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, _squareVertices);
glEnableVertexAttribArray(ATTRIB_TEXTCOORD);
glVertexAttribPointer(ATTRIB_TEXTCOORD, 2, GL_SHORT, 0, 0, coords);
float x1 = self.position.x;
float y1 = self.position.y;
glUniform1f(shader.ext_uniforms[UNIFORM_TRANSLATE_X], -x1+_squareVertices[0]);
glUniform1f(shader.ext_uniforms[UNIFORM_TRANSLATE_Y], -y1+_squareVertices[1]);
glUniform1f(shader.ext_uniforms[UNIFORM_ROTATE], self.rotation);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(ATTRIB_VERTEX);
glDisableVertexAttribArray(ATTRIB_TEXTCOORD);
}
Quand il est appelé au moins une fois, il fonctionne parfaitement vite. Mon shaders est aussi très simple:
vec4 col = texture2D(texture, coordVarying);
gl_FragColor = col;
Merci!
la quantité de données est seulement 8 flotteurs plus couple shorts comme texcoords, aussi shader est assez petit et je charge, lier les variables et le lier au moment du chargement de l'application. Donc, dans mon [shader useShader] appel suit: - (void) useShader { \t glUseProgram (_program); \t glBindTexture (GL_TEXTURE_2D, _texture); \t glUniform1i (uniformes [UNIFORM_TEXTURE], 0); } –
le problème était dans le chargement des shaders, il y avait quelques petits shaders chargés et liés au début, mais comme vous l'avez dit le transfert a commencé lors de la première utilisation, j'ai utilisé les shaders pendant le chargement , Merci! –