Подтвердить что ты не робот

Java.lang.RuntimeException: eglSwapBuffers не удалось: EGL_SUCCESS

У меня есть приложение OpenGL в Google Play Store, и я столкнулся с ежедневным исключением:

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 для любой информации об устройстве, но у них их нет (так они говорят). Информация о платформе в исключении установлена ​​в "OTHER".

Я нашел несколько подсказок в сети, что эта ошибка может быть от устройства Samsung Galaxy Y, и я нашел несколько предложений, которые включают:

android:configChanges="orientation|screenSize"

в файле манифеста Android, но это не сработает!

И, конечно, у меня есть обработка onPause и onResume для моей поверхности GL, которая, если нет, создает другие проблемы eglSwapBuffer.

Есть ли у кого-нибудь решение этой проблемы?

Спасибо!

4b9b3361

Ответ 1

Нет решения, просто комментарий

По некоторым причинам я не могу комментировать предыдущие сообщения, но у меня есть некоторые наблюдения, которые, возможно, могут помочь.

У нас та же проблема и мы стараемся найти решение... Мы резко уменьшили размер наших текстур, и теперь ни один не превышает 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)

Также ошибка сообщается в двух вариантах с разными номерами строк:

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)

Я не знаю, полезен ли я здесь, но в случае, если это поможет...

Ответ 2

Возможно, вашей памяти недостаточно для загрузки всех данных. Я тоже встретил эту проблему, когда делал свою игру с AndEngine, слишком большим Атласом размером больше 1024x1024, данные могут быть сломаны.

Ответ 3

Нет решения, просто наблюдения.

Вызов eglSwapBuffers возвращает false. Следующая обработка ошибок не справляется с тем, что нет ошибки - возможно, она не была задана EGL; ИЛИ неверное возвращаемое значение.

Я не нашел соответствующие источники. Эти устройства либо запускают исправленный GLSurfaceView (поиск трассировки стека не нашел ничего...), либо они используют промежуточную версию (ну, я не знаю, был ли 4.0.2 официальным, grepcode содержит только 4.0.1 и 4.0.3); Или я что-то пропустил.

Вы должны отслеживать, какие именно устройства/версии для Android запускаются в эту проблему. Затем вы можете попытаться решить эту проблему, предоставив исправленную GLSurfaceView самостоятельно или используя другую конфигурацию EGL, при условии, что проблема может быть устранена вообще. Есть ошибки, которые остаются необработанными в течение нескольких недель; задаваясь вопросом, какие большие проблемы стоят перед ответственной командой...

Ответ 4

Решением, которое я завершил, было добавление глобального обработчика исключений, чтобы поймать эту ошибку (поскольку она выбрасывается за пределы любого потока, которым я управляю).

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

Итак, по крайней мере, приложение не сбой, и я могу выслать сообщение, объясняющее ситуацию.