繁体   English   中英

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

[英]java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCESS report

我有使用libgdx框架的android游戏

在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,三星银河Y,LGE LG-P990,摩托罗拉光子4G,摩托罗拉Droid X2,

此问题以前已经在这里报告 已经存在问题

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

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

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

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

1)从兼容列表中筛选出低端设备。

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

最后编辑的解决方案。


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

事实是,由于内存不足,它没有发生。 我记录了游戏的当前内存使用情况,当我有80 MB或更多的可用内存时,它没有超过3 MB。 我什至始终运行System.gc() ,这提示垃圾回收器释放了一些ram空间。

我没有解决方法,但是一旦找到答案,我就会立即更新。


搜索后,与gpu相关的内容(例如纹理)不会由垃圾收集器管理(这就是为什么应该手动处理它们的原因)。 因此,调用System.gc()毫无意义。 尽管如此,我仍在处理所有纹理,并且游戏的内存使用率非常低。


我尝试了各种解决方案,但没有任何效果,但以下是应解决问题的东西(尚未尝试过,但仍然可以解决):

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

  2. 避免使用raw Texture ,而应使用POT(2的幂) TextureAtlas

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


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


解:

我认为GamesetScreen(screen)调用Screendispose() (事实并非如此)。 dispose()用于处理我所有的基础纹理。 我只是通过在Screenhide()重写方法中调用dispose()来解决问题。

使用TextureAtlas非常重要,因为可以减少附加到每个Texture的句柄数量 (这可能是EGL_SUCCESS错误的原因)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM