2015-05-22 17 views
28

continuo a ottenere questo rapporto di erroreeglMakeCurrent fallito EGL_BAD_ALLOC

Fatal Exception: java.lang.IllegalStateException 
eglMakeCurrent failed EGL_BAD_ALLOC 
android.view.HardwareRenderer$GlRenderer.createSurface 

sulla mia app che si trova sul Play Store. Cosa causa questo crash e come può essere risolto? Di seguito è riportato il log degli errori completo.

java.lang.IllegalStateException: eglMakeCurrent failed EGL_BAD_ALLOC 
    at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1354) 
    at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:1241) 
    at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:1058) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1811) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1235) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6472) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:603) 
    at android.view.Choreographer.doFrame(Choreographer.java:573) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:157) 
    at android.app.ActivityThread.main(ActivityThread.java:5356) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
    at dalvik.system.NativeStart.main(NativeStart.java) 
+0

ehi hai trovato una soluzione a questo? –

+0

@OshaMahue Nope.I non ne ho mai trovato uno. –

+0

@AlexKombo Puoi dirci quali dispositivi stanno avendo questo errore? Sembra che l'errore sia specifico del dispositivo e sapere che il dispositivo aiuterà a restringerlo. – Milk

risposta

1

Se si guarda al EGL specification, ci sono diverse possibili cause per questo errore. Sembra che qualcosa nella tua applicazione stia causando l'esaurimento delle risorse. Gli stati spec il seguente:

3.7.3 Contesti Rilegatura e drawable

... eglMakeCurrent lega CTX al thread di rendering corrente e alle superfici disegnare e Leggi ...

errori

... Se i buffer ausiliari per pareggio e di lettura non possono essere assegnati, un 01.235.164,106 mila viene generatoEGL_BAD_ALLOC errore ...

per risolvere il problema, si potrebbe esaminare l'utilizzo della memoria della vostra applicazione. Ci sono molte tecniche diverse per indagare l'utilizzo della RAM della vostra applicazione, some techniques are documented quite well in this guide.

This post descrive anche che l'errore viene generato quando si chiama eglMakeCurrent se i EGL_WIDTH e EGL_HEIGHT parametri del buffer di pixel non sono impostati quando si chiama eglCreatePbufferSurface. Ecco un esempio java minimo per creare un buffer di pixel (full source located here), assicurarsi che la larghezza di ingresso e l'altezza sono maggiori di zero:

private void eglSetup(int width, int height) { 
    mEGL = (EGL10)EGLContext.getEGL(); 
    mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
    if (!mEGL.eglInitialize(mEGLDisplay, null)) { 
     throw new RuntimeException("unable to initialize EGL10"); 
    } 

    // Configure EGL for pbuffer and OpenGL ES 2.0. We want enough RGB bits 
    // to be able to tell if the frame is reasonable. 
    int[] attribList = { 
      EGL10.EGL_RED_SIZE, 8, 
      EGL10.EGL_GREEN_SIZE, 8, 
      EGL10.EGL_BLUE_SIZE, 8, 
      EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT, 
      EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
      EGL10.EGL_NONE 
    }; 
    EGLConfig[] configs = new EGLConfig[1]; 
    int[] numConfigs = new int[1]; 
    if (!mEGL.eglChooseConfig(mEGLDisplay, attribList, configs, 1, numConfigs)) { 
     throw new RuntimeException("unable to find RGB888+pbuffer EGL config"); 
    } 

    // Configure context for OpenGL ES 2.0. 
    int[] attrib_list = { 
      EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, 
      EGL10.EGL_NONE 
    }; 
    mEGLContext = mEGL.eglCreateContext(mEGLDisplay, configs[0], EGL10.EGL_NO_CONTEXT, 
     attrib_list); 
    checkEglError("eglCreateContext"); 
    if (mEGLContext == null) { 
     throw new RuntimeException("null context"); 
    } 

    // Create a pbuffer surface. By using this for output, we can use glReadPixels 
    // to test values in the output. 
    int[] surfaceAttribs = { 
      EGL10.EGL_WIDTH, width, 
      EGL10.EGL_HEIGHT, height, 
      EGL10.EGL_NONE 
    }; 
    mEGLSurface = mEGL.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs); 
    checkEglError("eglCreatePbufferSurface"); 
    if (mEGLSurface == null) { 
     throw new RuntimeException("surface was null"); 
    } 

    mEGL.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext); 
} 

È difficile individuare la causa esatta senza conoscere maggiori dettagli sulla realizzazione dell'applicazione . Questo dovrebbe essere un buon punto di partenza per identificare e risolvere il problema.