2011-12-16 4 views
0

J'ai modifié un exemple d'application opengl pour certains tests de vitesse qui ont vraiment l'air lent et j'aimerais savoir si je fais quelque chose de mal ici.Android opengl est-il vraiment plus lent que le canvas?

La configuration, le chargement & La liaison et le rendu sont des fonctions différentes et affichent un carré sur l'écran, mais à une vitesse de 6 fps. Le même code que j'ai écrit est beaucoup plus rapide avec canvas.

Que puis-je faire pour accélérer cela, et je veux dire accélérer sérieusement?

(PS: Je l'ai déjà essayé glDrawTexiOES et plus vite il en est encore loin toile près)

// Setup of opengl 
gl.glEnable(GL10.GL_TEXTURE_2D); 
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 

// Loading & Binding of Texture 
InputStream is = context.getResources().openRawResource(R.drawable.t2); 
map = BitmapFactory.decodeStream(is); 

gl.glGenTextures(1, textures, 0); 

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, map, 0); 


// Rendering 

public void draw(GL10 g, int screenx, int screeny, int[] mem) 
{ GL11 gl = (GL11) g; 

    //Point to our buffers 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    //Set the face rotation 
    gl.glFrontFace(GL10.GL_CCW); 
    //Enable the vertex and texture state 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    //Bind our only previously generated texture in this case 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
    //Draw the vertices as triangles, based on the Index Buffer information 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); 

    // Cleanup 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
} 
+0

Testez-vous sur un périphérique réel? Je ne serais pas surpris si OpenGL était si lent dans l'émulateur. – wolfgang

+0

Je l'utilise dans une machine virtuelle où il fonctionne beaucoup plus vite que sur un périphérique réel. Au moins beaucoup plus vite que sur un onglet de galaxie que je pourrais tester et les fps étaient vraiment * très * décevants ... – HardCoder

+0

Je ne vois absolument rien dans votre code qui expliquerait pourquoi il devrait fonctionner à moins de 60fps sur un onglet de galaxie (en supposant que les indices contiennent un carré = deux triangles). Le problème pourrait-il être ailleurs? Comment mesurez-vous fps? – wolfgang

Répondre

1

J'ai essayé le code affiché, et qui travaille pour moi sans problème. Evidemment c'est plus rapide (beaucoup) sur mon Galaxy S que sur l'émulateur d'un Core i7 920. Vu que sur l'appareil actuel vous avez une vitesse plus lente que sur l'émulateur, le problème devrait être dans l'écriture de fichier sur la carte SD. Essayez de commenter cela, ou écrivez sur un tableau/liste, puis, lorsque vous fermez l'application, écrivez le tableau sur le SD (avertissement: taille de tableau/liste se développe rapidement). Rappelez-vous que si vous écrivez sur le SD à chaque image, OpenGL doit attendre au moins 15 ms à chaque fois. Si ce n'est pas ça, vous devriez nous donner plus d'informations.

Questions connexes