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

6

我有一个使用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。


你找到这个问题的解决方案了吗? - user874649
1
不,它取决于GPU内存是否已满。 - Bera
3个回答

6
这个问题之前已经在此处报告过。已经有一个问题被提交。
您可以通过提供更多细节来帮助解决这个问题。

1
我进行了一些研究,发现这个问题在低端设备上会出现,因为它们的内存较低。在两个场景之间加载和卸载纹理会导致SwapBuffer崩溃,从而引发此运行时异常。
最让人烦恼的是,当我在这样的设备上进行测试时,并没有遇到任何此类错误,但在Playstore上,我收到了太多关于此问题的报告。
因此,我们可以通过以下两种方式解决此问题:
1)从兼容列表中过滤掉低端设备。
2)使用UncaughtExceptionHandler()捕获异常,并告知用户存在低内存问题。

0

最后编辑中的解决方案。


我的低端设备(GT-S5830GT-S5830i)也出现了这种情况。

问题在于,这并不是由于内存不足造成的;我记录了游戏当前的内存使用情况,它没有超过3兆字节,而我有80多兆字节的可用内存。我甚至一直运行System.gc(),这提示垃圾收集器释放一些内存空间。

我没有解决方法,但我会尽快更新这个答案。


经过一些搜索,与GPU相关的内容(如纹理)不受垃圾回收器管理(这就是为什么它们应该手动处理的原因)。因此调用 System.gc() 是有些毫无意义的。尽管如此,我仍然会处理所有的纹理,我的游戏内存使用率非常低。

我尝试了各种解决方案,但都没有起作用。不过,这里有一个应该可以解决问题的方法(虽然我还没有尝试过,但应该仍然有效):

  1. 简单地不要一遍又一遍地加载太多纹理。我的游戏曾经在用户从屏幕导航离开时处理并初始化所有纹理。这可能会导致问题。你需要做的是将已加载的纹理/纹理图集保存在内存中(不要失去它们的引用)。这样,返回到屏幕时就不会重新加载所有纹理。

  2. 避免使用原始的Texture,而是使用一个POT(Power Of Two) TextureAtlas

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


那并不是问题所在。我运行了一个非常长的纹理释放和加载循环,没有抛出任何异常/错误。我上面的建议不是解决方案。问题可能与过多的Screen切换有关,但我猜想不是因为这个问题也会在反复从纵向模式切换到横向模式和反之时发生。


解决方案:

我曾认为GamesetScreen(screen)会自动调用Screendispose()(实际上并非如此)。dispose()被用于释放所有底层纹理。 我通过在Screenhide()重写方法中调用dispose()来简单地解决了这个问题。

使用TextureAtlas非常重要,因为您可以减少与每个Texture相关联的句柄数量。(这可能是EGL_SUCCESS错误的原因)

GT-S5830GT-S5830i(三星Galaxy Ace和三星Galaxy Y)上进行了测试。问题不再出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接