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、

4

3 回答 3

6

此问题已在此处报告过。已经提交了一个问题

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

于 2012-06-04T04:41:21.863 回答
1

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

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

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

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

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

于 2014-10-21T07:03:42.033 回答
0

上次编辑中的解决方案。


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

问题是,它不是因为内存不足而发生的。我记录了我游戏的当前内存使用情况,当我有 80 或更多的可用内存时,它没有超过 3 兆字节。我什至一直跑System.gc(),这提示垃圾收集器释放一些内存空间。

我没有解决方法,但我一找到答案就会更新这个答案。


经过一番搜索,gpu 相关的东西(如纹理)不是由垃圾收集器管理的(这就是为什么它们应该手动处理)。所以打电话System.gc()是毫无意义的。尽管如此,我正在处理我的所有纹理,并且我的游戏的内存使用率非常低。


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

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

  2. 避免使用 raw Texture,而是使用POT (Power Of Two) TextureAtlas

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


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


解决方案:

我认为Game'setScreen(screen)调用Screen' 是dispose()自动的(事实并非如此)。dispose()用于处理我所有的底层纹理。我只是通过调用 的覆盖方法解决了这个问题。dispose()Screenhide()

使用TextureAtlass 非常重要,因为您可以减少附加到每个Texture. (这可能是 EGL_SUCCESS 错误的原因)

GT-S5830在和GT-S5830i(三星 Galaxy Ace 和三星 Galaxy Y)上都经过测试。不再出现问题。

于 2017-04-30T07:07:38.450 回答