23

我在 Google Play 商店中有一个 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)

问题是,在我所有的智能手机上,我都无法重现此错误。我已经联系了谷歌以获取任何设备信息,但他们没有(他们说)。异常中的平台信息设置为“其他”。

我在网上发现了一些提示,表明此错误可能来自三星 Galaxy Y 设备,并且我发现了一些建议,包括:

android:configChanges="orientation|screenSize"

在 Android 清单文件中,但这不起作用!

当然,我已经为我的 GL 表面实现了 onPause 和 onResume 处理,如果没有,则会产生其他 eglSwapBuffer 问题。

有没有人解决这个问题?

谢谢!

4

4 回答 4

11

没办法,只能评论

由于某些原因,我无法评论以前的帖子,但我有一些观察可能会有所帮助。

我们有同样的问题,正在努力寻找解决方案……我们大大减小了纹理的大小,现在没有一个大于 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)

我不知道我在这里是否有用,但如果它有帮助......

于 2013-01-10T15:47:58.540 回答
6

一开始您的内存可能不足以加载所有数据。我在使用 AndEngine 制作游戏时也遇到了这个问题,太多的 Atlas 尺寸大于 1024x1024 ,数据可能会被破坏。

于 2012-05-17T14:54:48.257 回答
4

没有解决办法,只有观察。

调用eglSwapBuffers返回 false。以下错误处理无法处理没有错误的情况——可能它没有被 EGL 设置;或者返回值错误。

我没有找到匹配的来源。这些设备要么运行 patched GLSurfaceViews(堆栈跟踪搜索没有找到任何东西......)要么使用中间版本(好吧,我不知道 4.0.2 是否是官方的,grepcode 仅包含 4.0.1 和 4.0 .3); 或者我错过了一些东西。

您必须追踪哪些确切的设备/android 版本遇到了这个问题。然后,您可以尝试通过自己提供修补程序GLSurfaceView或使用不同的 EGL 配置来解决此问题——前提是问题可以完全解决。几个星期未处理的错误;想知道负责任的团队面临哪些更大的问题......

于 2012-05-05T08:33:16.500 回答
2

我最终实现的解决方案是添加一个全局异常处理程序来捕获这个错误(因为它被抛出到我可以控制的任何线程之外)。

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

所以至少应用程序不会崩溃,我可以发布一条消息来解释这种情况。

于 2013-02-20T16:50:45.113 回答