2017-04-17 1 views
0

J'utilise la méthode de rendu OpenGL pour capturer la capture d'écran. Mais cela prend de 7 à 8 secondes sur NEXUS 7 pour lire les informations sur les pixels. J'utilise ce code pour lire les informations sur les pixels et les enregistrer sous forme de bitmap.La capture d'écran OpenGL prend trop de temps sur Android?

public Bitmap grabPixels(GL10 mGL) { 

     final int mWidth = mViewWidth; 
     final int mHeight = mViewHeight; 

     IntBuffer ib = IntBuffer.allocate(mWidth * mHeight); 
     IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight); 
     mGL.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); 

     for (int i = 0; i < mHeight; i++) { 
      for (int j = 0; j < mWidth; j++) { 
       ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i * mWidth + j)); 
      } 
     } 

     Bitmap mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
     mBitmap.copyPixelsFromBuffer(ibt); 
     return mBitmap; 

} 

Comment puis-je augmenter la vitesse de lecture des informations de pixels et le convertir dans le Bitmap?

+0

Avez-vous mesuré lequel de votre commande prend le temps? Lire les pixels ou stocker le bitmap? – BDL

+0

@BDL Le stockage du bitmap prend trop de temps Le code suivant prend trop de temps: - pour (int i = 0; i

+0

Je voudrais alors éditer la question à "pourquoi est-ce que le stockage d'une image dans android prend autant de temps" et éditer toutes les choses OpenGL-es car ils semblent sans rapport. Cela pourrait vous attirer plus d'attention car les gens constatent immédiatement qu'aucune connaissance OpenGL n'est requise. (Ceci est juste une recommandation) – BDL

Répondre

0

I wrote another answer about saving GIFs on gamedev, which might be useful.

Vous ne pouvez pas appeler glReadPixels() sur un autre fil. Mais c'est probablement (comme vous l'avez dit) le processus de sauvegarde de l'image qui prend le plus de temps. En tant que tel, la solution est de faire l'économie sur un thread séparé.

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     ... save screenshot ... 
    } 
}).start(); 

Avant que quelqu'un ne vienne chez moi avec des fourches. Alors oui vous pouvez appelez glReadPixels() sur un autre fil. Il nécessite cependant un contexte partagé, qui peut être spécifié lors de l'appel eglCreateContext().

EGLContext shared = ... 
EGLDisplay display = ... 
EGLConfig eglConfig = ... 

int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; 
EGLContext context = egl.eglCreateContext(display, eglConfig, shared, attrib_list); 

Mais avant de sauver l'image, il est plus probable que vous commencez à creuser dans des contextes partagés (qui peut être une douleur en eux-mêmes), alors assurez-vous que votre goulot d'étranglement est pas.