web-dev-qa-db-ja.com

eglMakeCurrentがEGL_BAD_ALLOCに失敗しました

このエラーレポートを受け取り続けます

Fatal Exception: Java.lang.IllegalStateException
eglMakeCurrent failed EGL_BAD_ALLOC
Android.view.HardwareRenderer$GlRenderer.createSurface

playストアにある私のアプリで。このクラッシュの原因とその修正方法を教えてください。以下は完全なエラーログです。

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)
29
Alex Kombo

EGL仕様 を見ると、このエラーの原因はいくつか考えられます。アプリケーションの何かが原因でリソースが不足しているようです。仕様には次のように記載されています。

3.7.3コンテキストとドローアブルのバインド

... eglMakeCurrentは、ctxを現在のレンダリングスレッドと描画および読み取りサーフェスにバインドします。

エラー

...描画および読み取り用の補助バッファを割り当てることができない場合、EGL_BAD_ALLOCエラーが生成されます。

問題のトラブルシューティングを行うために、アプリケーションのメモリ使用量を調べることができます。アプリケーションのRAMの使用状況を調査するには、さまざまな手法があります。 このガイドでは、いくつかの手法について詳しく説明しています。

この投稿 は、eglCreatePbufferSurfaceの呼び出し時にピクセルバッファのEGL_WIDTHおよびEGL_HEIGHTパラメータが設定されていない場合、eglMakeCurrentの呼び出し時にエラーがトリガーされることも説明しています。ピクセルバッファを作成するための最小限のJavaサンプル (完全なソースはここにあります) 、入力の幅と高さがゼロより大きいことを確認してください。

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

アプリケーションの実装に関する詳細を知らなければ、正確な原因を特定することは困難です。これは、問題を特定して修正するための良い出発点になるはずです。

3
sparkplug

このEGLエラーは通常、デバイス固有のハードウェアアクセラレーションの問題が原因で発生します。 Webビューは、このエラーの影響を特に受けやすい可能性があります。問題のあるビューについては、ハードウェアアクセラレーションを無効にしてみてください。エラーが続く場合は、アクティビティライフサイクルに適切にフックしていることを確認してください。これにより、EGL割り当てがクラッシュする可能性もあります。具体的には、囲んでいるアクティビティで呼び出されたときに、GLSurfaceViewでonPauseとonResumeが呼び出されるかどうかを確認します。

リソース:

  1. CreateWindowSurfaceがEGL_BAD_ALLOCに失敗しました
  2. GLSurfaceView EGL_BAD_ALLOC
  3. GLSurfaceView in Android 2.3.xは一貫してEGL_BAD_ALLOCを生成します
0
Sanjay Bhalani