【问题标题】:java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCESSjava.lang.RuntimeException:eglSwapBuffers 失败:EGL_SUCCESS
【发布时间】:2012-05-05 06:09:16
【问题描述】:

我在 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)

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

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

android:configChanges="orientation|screenSize"

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

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

有没有人解决这个问题?

谢谢!

【问题讨论】:

  • 你找到解决这个问题的方法了吗?
  • 不,我没有找到解决方案,我已从支持的设备列表中删除了三星 Galaxy Y 设备。
  • 我确认在三星 Galaxy SIII 上遇到了同样的错误
  • 您找到解决方案了吗?这确实会影响性能。

标签: android opengl-es


【解决方案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)

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

【讨论】:

  • 我用每种型号的所有型号风格更新了设备列表。
  • 在 Galaxy SIII 中出现了同样的错误,只是在不同的行:java.lang.RuntimeException: eglSwapBuffers failed: EGL_BAD_ALLOC at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1178) at android。 opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1136) 在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1463) 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)跨度>
  • 我从 16 台设备中得到了这个,其中 12 台是 GT-S5830i(三星 Galaxy Ace)。
  • 同样的问题,同样的设备。我正在开发者控制台中过滤。
【解决方案2】:

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

【讨论】:

  • 我在应用程序启动时加载了高达 2048x1024 像素的纹理。到目前为止,我不知道是哪个设备导致了这些异常,因为三星 Galaxy Y 不是问题,我在此设备上成功测试了我的应用程序。也许摆脱这个异常的唯一方法是过滤掉低端设备。
【解决方案3】:

没有解决方案,只有观察。

致电eglSwapBuffers returns false。以下错误处理无法处理没有错误的情况——可能它没有被 EGL 设置; OR 返回值错误。

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

您必须找出遇到此问题的确切设备/Android 版本。然后,您可以尝试通过自己提供已修补的GLSurfaceView 或使用不同的 EGL 配置来解决此问题——前提是问题可以完全解决。 There are bugs 数周未处理;想知道负责任的团队面临哪些更大的问题......

【讨论】:

  • 感谢您的回答。我也研究了 Android 资源,得出了相同的结论。与此同时,一位用户提到他正在使用这款三星 Galaxy Y 设备。我已经为我订购了一个,以便能够对此进行测试。但无论如何,如果这个问题的解决方案是编写我自己的 GLSurfaceView,我对此并不满意。不过还是谢谢你的建议。
  • 恐怕不行。 Manh 提到他有同样的问题,但在他的情况下,内存不够。我已在此三星 Galaxy Y 上订购并测试了我的应用程序,这可能会导致问题。但在我的版本上一切正常。唯一的进步可能是认识到,您不应该尝试使应用程序与所有设备兼容,即使那些显然没有意义的设备(低分辨率屏幕等)也是如此。因为我认为其中一个低端设备导致了这个问题。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2016-01-22
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多