2015-05-22 12 views
28

başarısız oldu. Bu çöküşe neden olan nedir ve nasıl düzeltilebilir? Tam hata günlüğü aşağıdadır.

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

Bunun için bir çözüm buldunuz mu? –

+0

@OshaMahue Nope.O bir tane bulamadım. –

+0

@AlexKombo Hangi cihazların bu hatayı aldığını söyleyebilir misiniz? Hata, aygıta özeldir ve aygıtın daraltılmasının yardımcı olacağını bilmektedir. – Milk

cevap

1

EGL specification'a bakarsanız, bu hatanın olası nedenleri vardır. Uygulamanızda bir şey kaynakların tükenmesine neden oluyor gibi görünüyor.

3.7.3 Cilt Bağlam ve Drawables

... eglMakeCurrent mevcut oluşturan iplik ve beraberlik ve okuma yüzeylerine ctx bağlar ...

: Aşağıdaki Spec devletler

Hatalar

... beraberlik ve okumak için yardımcı tamponlar tahsis edilemezse, bir EGL_BAD_ALLOC hata

sorunu gidermek için ... oluşturulur, uygulamanızın bellek kullanımını incelemek olabilir. Başvurunuzun ram kullanımını araştırmak için birçok farklı teknikler some techniques are documented quite well in this guide.

This post da eglCreatePbufferSurface çağrılırken piksel tampon EGL_WIDTH ve EGL_HEIGHT parametreleri ayarlamak değilse eglMakeCurrent çağrılırken hata tetiklenir olduğunu açıklar vardır. İşte piksel tampon (full source located here) oluşturmak için minimal bir java örnek, giriş genişlik ve yükseklik sıfırdan büyük olmasını sağlamak:

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); 
} 

uygulamanın uygulanmasına ilişkin daha fazla ayrıntı bilmeden kesin nedeni tam olarak belirlemek zordur . Bu, sorunu tanımlamak ve düzeltmek için iyi bir başlangıç ​​noktası olmalıdır.

İlgili konular