2015-05-22 53 views
28

ja ciągle otrzymuję ten raport o błędacheglMakeCurrent udało EGL_BAD_ALLOC

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

na mojej aplikacji, która jest w Play Store. Co powoduje tę awarię i jak można ją naprawić? Poniżej znajduje się pełny dziennik błędów.

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

Hej, możesz znaleźć rozwiązanie tego problemu? –

+0

@OshaMahue Nope.Nigdy go nie znalazłem. –

+0

@AlexKombo Czy możesz nam powiedzieć, które urządzenia mają ten błąd? Wygląda na to, że błąd dotyczy urządzenia i wiemy, że urządzenie pomoże je zawęzić. – Milk

Odpowiedz

1

Jeśli spojrzeć na EGL specification, istnieje kilka możliwych przyczyn tego błędu. Wygląda na to, że coś w aplikacji powoduje wyczerpanie zasobów. Spec stany następujące:

3.7.3 Wiązanie kontekstach i kanału alfa

... eglMakeCurrent wiąże CTX do bieżącego wątku renderowania i do powierzchni rysować i czytać ...

Błędy

... Jeśli bufory pomocnicze w losowaniu i czytać nie można przyporządkować, EGL_BAD_ALLOC Generowany jest błąd ...

Aby rozwiązać problem, można sprawdzić zużycie pamięci aplikacji. Istnieje wiele różnych technik w celu zbadania wykorzystania pamięci RAM aplikacji, some techniques are documented quite well in this guide.

This post opisuje również, że błąd został wywołany podczas wywoływania eglMakeCurrent jeśli parametry bufora pikseli EGL_WIDTH i EGL_HEIGHT nie są ustawione podczas wywoływania eglCreatePbufferSurface. Oto minimalna próbka Java, aby stworzyć bufor pikseli (full source located here) upewnić się, że szerokość wejścia i wysokość są większe niż 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); 
} 

Trudno jest ustalić dokładną przyczynę, nie znając więcej szczegółów na temat wdrażania aplikacji . Powinien to być dobry punkt wyjścia do identyfikacji i rozwiązania problemu.

Powiązane problemy