java.lang.RuntimeException:eglSwapBuffers失败:EGL_SUCCESS报告

时间:2012-06-03 14:45:58

标签: android opengl-es libgdx

我有安卓游戏,使用libgdx框架

在Google Play商店中有报告:

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)

我能做什么?

设备报道:三星GT-S5830i,三星galaxy Y,LGE LG-P990,摩托罗拉Photon 4G,摩托罗拉Droid X2,

3 个答案:

答案 0 :(得分:6)

已报告此问题here before。已经提交了an issue

您可以通过提供此问题的更多详细信息来提供帮助。

答案 1 :(得分:1)

我做了一些研究,发现这个问题出现在低端设备中,因为它们的内存很低。在两次场景崩溃之间加载和卸载纹理SwapBuffer并因此抛出此运行时异常。

关于这个问题最烦人的事情是,当我在这些设备上测试时,我没有得到任何这样的错误,但在Playstore中我收到的报告太多了。

因此,我们可以通过两种方式解决这个问题:

1)从兼容列表中过滤掉低端设备。

2)使用UncaughtExceptionHandler()捕获异常并告诉用户低内存问题。

答案 2 :(得分:0)

上次修改时的解决方案。

它实际上也发生在我的低端设备上(GT-S5830GT-S5830i)。

事实是,由于内存不足,它没有发生;我记录了我游戏的当前内存使用情况,当我有80或更多兆字节的免费内存时,它没有超过3兆字节。我甚至一直运行System.gc(),暗示垃圾收集器释放了一些ram空间。

我没有解决方法,但会在找到答案后立即更新此答案。

在一些搜索之后,垃圾收集器不管理与gpu相关的东西(如纹理)(这就是为什么它们应该手动处理)。所以调用System.gc()在某种程度上毫无意义。不过,我正在处理我的所有纹理,而且我的游戏的内存使用率非常低。

我尝试了各种各样的解决方案并且没有任何工作但是这里应该解决问题(没有尝试过这个,但应该可以工作):

  1. 只是不要一遍又一遍地加载这么多纹理。我的游戏用于处理,然后在用户离开屏幕时初始化所有纹理。这可能会导致问题。你需要做的是将加载的纹理/纹理地图集保存在内存中(不要丢失它们的引用)。这样,导航回屏幕就不会重新加载所有纹理。

  2. 避免使用原始Texture,而是使用 POT(2的幂) TextureAtlas

  3. 我会将这两个步骤应用到我的项目中,如果问题消失,我会回来确认我的解决方案。

    这根本不是问题。我运行了一个非常长的处理和加载纹理循环,没有抛出异常/错误。我的上述建议不是解决方案。这个问题可能与过度Screen切换有关,但我猜不会因为在从纵向模式到横向模式重复更改屏幕方向时也会出现此问题,反之亦然。

    解决方案:

    我认为Game的{​​{1}}会自动调用setScreen(screen)的{​​{1}}(事实并非如此)。 Screen用于处理我所有的底层纹理。 我只是通过在dispose()的{​​{1}}覆盖方法中调用dispose()来解决问题。

    使用dispose()非常重要,因为您减少了附加到每个Screen 的句柄数量。 (这可能是EGL_SUCCESS错误的原因)

    hide()TextureAtlas(三星Galaxy Ace和三星Galaxy Y)上进行了测试。问题不再发生。