2010-11-09 4 views
4

J'ai modifié le modèle OpenGL es 2.0 dans Xcode pour rendre cette petite boîte à une texture hors écran (50 * 50), puis réinitialiser le port de vue et rendre la texture à l'écran en utilisant un quad fullscreen. Mais le FPS a tellement baissé qu'on a vu des décalages évidents (environ 10).Pourquoi le framerate de mon modèle OpenGL ES 2.0 est-il si lent sur l'iPad?

Je sais que l'iPad a des problèmes concernant le fillrate, mais cela ne semble pas juste. J'ai utilisé seulement un FBO et changé sa couleur attachée entre texture et renderBuffer dans la boucle. Est-ce que cela a une influence? En outre, j'écrivais un visualiseur audio (comme celui de Windows Media Player) éditant des valeurs de pixels dans OpenGL. Aucune suggestion?

va ici le code:

//implement the texture in -(id)init   
glGenTextures(1, &ScreenTex); 
glBindTexture(GL_TEXTURE_2D, ScreenTex); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texSize, texSize, 0, GL_RGB, GL_UNSIGNED_BYTE, nil); 

//And in the render loop 
//draw to the texture 
glViewport(0, 0, texSize, texSize); 
glBindTexture(GL_TEXTURE_2D, ScreenTex); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ScreenTex, 0); 
glClear(GL_COLOR_BUFFER_BIT); 

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
glUniform1i(Htunnel, 0); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

//switch to render to render buffer here 
glViewport(0, 0, backingWidth, backingHeight); 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,colorRenderbuffer); 
glClear(GL_COLOR_BUFFER_BIT); 

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, texVertices); 
glUniform1i(Htunnel, 1); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

//vertex shader 
void main() 
{ 
    if (tunnel==0) { 
     gl_Position = position; 
     gl_Position.y += sin(translate)/2.0; 
     colorVarying = color; 
    }else { 
     f_texCoord = v_texCoord; 
     gl_Position = position; 
    } 
} 

//frag shader 
void main() 
{ 
    if (tunnel==0) { 
     gl_FragColor = colorVarying; 
    } else { 
     gl_FragColor = texture2D(s_texture, f_texCoord);  
    } 
} 
+0

Post un code ... – jv42

Répondre

3

Sans code réel, il sera difficile de choisir le goulot d'étranglement est où. Cependant, vous pouvez avoir une idée de l'origine du problème en utilisant des instruments pour localiser les causes.

Créez un nouveau document Instruments en utilisant à la fois l'instrument OpenGL ES et le nouveau fichier Time Profiler. Dans l'instrument OpenGL ES, appuyez sur le petit bouton de l'inspecteur sur le côté droit, puis cliquez sur le bouton Configurer. Assurez-vous que toutes les options de journalisation sont vérifiées sur la page résultante, en particulier le pourcentage d'utilisation du système d'exploitation et l'utilisation du système de rendu%. Cliquez sur Terminé et assurez-vous que ces deux statistiques sont vérifiées dans la page Select statistics to list.

Exécutez cet ensemble d'instruments contre votre application sur l'iPad pendant un petit moment pendant le rendu. Arrêtez-le et regardez les chiffres. Comme expliqué dans Pivot's answer to my question, si vous voyez le% d'utilisation du carrousel dans l'instrument OpenGL ES atteindre 100%, vous êtes limité par votre géométrie (peu probable ici). De même, si le% d'utilisation du Renderer est proche de 100%, vous avez un taux de remplissage limité. Vous pouvez également regarder les autres statistiques que vous avez enregistrées pour extraire ce qui pourrait se produire.

Vous pouvez ensuite vous tourner vers les résultats Time Profiler pour voir si vous pouvez réduire les zones sensibles dans votre code où les choses pourraient être ralenties. Trouvez les articles près du haut de la liste. Si elles sont dans votre code, double-cliquez dessus pour voir ce qui se passe. S'ils sont dans les bibliothèques système, filtrez les résultats jusqu'à ce que vous trouviez quelque chose de plus pertinent en faisant un clic droit sur le nom du symbole et en choisissant Charge Library to Callers ou Charge Symbol to Caller. À un certain point, vous commencerez à voir des symboles liés à OpenGL là-haut, qui devraient vous indiquer ce que fait le GPU. En outre, vous pourriez être surpris de trouver un peu de votre propre code ralentissant les choses.

Vous pouvez essayer un autre instrument OpenGL ES, mais il fait partie de la version bêta de Xcode 4 et est actuellement sous NDA. Consultez les vidéos de la session WWDC 2010 pour en savoir plus sur celui-ci.

+0

merci pour la réponse, Brad. J'ai posté mon code ici, une suggestion? – winterGoGoGo

Questions connexes