web-dev-qa-db-ja.com

java.lang.RuntimeException:eglSwapBuffersが失敗しました:EGL_SUCCESS

私はGooglePlayストアにOpenGLアプリケーションを持っていますが、毎日の例外に直面しています。

Java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCESS
at Android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.Java:1085)
at Android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.Java:1043)
at Android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.Java:1369)
at Android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.Java:1123)

問題は、すべてのスマートフォンでこのエラーを再現できないことです。私はすでにデバイス情報についてGoogleに連絡しましたが、何もありません(そう彼らは言います)。例外のプラットフォーム情報は「その他」に設定されています。

このエラーはSamsungGalaxy Yデバイスからのものである可能性があるというヒントをネット上で見つけ、次のような提案をいくつか見つけました。

Android:configChanges="orientation|screenSize"

Androidマニフェストファイルにありますが、これは機能しません!

そしてもちろん、onPauseとonResumeの処理をGLサーフェスに実装しました。そうでない場合、他のeglSwapBufferの問題が発生します。

この問題の解決策はありますか?

ありがとう!

23
Andi Droid

解決策なし、コメントのみ

いくつかの理由で、以前の投稿にコメントすることはできませんが、おそらく役立つ可能性のあるいくつかの観察結果があります。

同じ問題があり、解決策を見つけるのに苦労しています...テクスチャのサイズを大幅に縮小し、1024x900よりも大きいものはありません(フォントのものを忘れないでください)。しかし、まだいくつか必要であり、問​​題はまだあります。問題のあるデバイスを次のデバイスに特定しました。

Samsung Galaxy Y (GT-S5360 GT-S5360B GT-S5360L GT-S5363 GT-S5368 GT-S5369 SCH-I509 SCH-i509)
Samsung Galaxy Y Duos (GT-S6102 GT-S6102B GT-S6102E ivory)
Samsung Galaxy Ace (GT-S5830 GT-S5830B GT-S5830C GT-S5830D GT-S5830G GT-S5830L GT-S5830M GT-S5830T GT-S5830i GT-S5838 GT-S5839i GT-S6358 SCH-I619 SHW-M240S)
Samsung Galaxy Ace Duos (GT-S6802 GT-S6352 GT-S6802B SCH-I579 SCH-I589 SCH-i579 SCH-i589)
Samsung Galaxy Mini (GT-S5570 GT-S5570B GT-S5570I GT-S5570L GT-S5578 SGH-T499 SGH-T499V SGH-T499Y)
Samsung Galaxy Pocket (GT-S5300 GT-S5300B GT-S5302 GT-S5302B)

また、エラーは行番号の異なる2つのフレーバーで報告されます。

Java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCESS
    at Android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.Java:1099)
    at Android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.Java:1057)
    at Android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.Java:1389)
    at Android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.Java:1138)

Java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCESS
    at Android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.Java:1085)
    at Android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.Java:1043)
    at Android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.Java:1369)
    at Android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.Java:1123)

ここで役立つかどうかはわかりませんが、役立つ場合は...

11
Florian

最初にすべてのデータをロードするには、メモリが十分でない可能性があります。 AndEngineでゲームを作成するときにもこの問題に遭遇しました。サイズが1024x1024を超えるアトラスが多すぎると、データが破損する可能性があります。

6
Manh

解決策はなく、観察のみです。

eglSwapBuffersへの呼び出しはfalseを返します 。次のエラー処理は、エラーがない場合には対応していません。EGLによって設定されていない可能性があります。 [〜#〜]または[〜#〜]戻り値が間違っています。

一致するソースが見つかりませんでした。これらのデバイスは、パッチが適用されたGLSurfaceViewsを実行するか(スタックトレース検索で何も見つかりませんでした...)、中間バージョンを使用します(4.0.2が公式かどうかはわかりませんが、grepcodeには4.0.1および4.0.3); [〜#〜]または[〜#〜]何かが足りませんでした。

この問題が発生した正確なデバイス/ Androidバージョンを追跡する必要があります。次に、パッチを適用したGLSurfaceViewを自分で提供するか、別のEGL構成を使用して、この問題の回避を試みることができます。ただし、問題を完全に修正できる場合に限ります。 バグがあります 何週間も処理されないままになっています。責任あるチームが直面しているより大きな問題は何か疑問に思っています...

4
Stefan Hanke

私が実装することになった解決策は、このエラーをキャッチするためにグローバル例外ハンドラーを追加することでした(それは私が制御できるスレッドの外にスローされるため)。

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {...})

したがって、少なくともアプリケーションはクラッシュせず、状況を説明するメッセージを表示できます。

2