![](/img/trans.png)
[英]java.lang.RuntimeException: eglSwapBuffers failed: 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-S5830
和GT-S5830i
)上。
事实是,由于内存不足,它没有发生。 我记录了游戏的当前内存使用情况,当我有80 MB或更多的可用内存时,它没有超过3 MB。 我什至始终运行System.gc()
,这提示垃圾回收器释放了一些ram空间。
我没有解决方法,但是一旦找到答案,我就会立即更新。
搜索后,与gpu相关的内容(例如纹理)不会由垃圾收集器管理(这就是为什么应该手动处理它们的原因)。 因此,调用System.gc()
毫无意义。 尽管如此,我仍在处理所有纹理,并且游戏的内存使用率非常低。
我尝试了各种解决方案,但没有任何效果,但以下是应解决问题的东西(尚未尝试过,但仍然可以解决):
只是不要一遍又一遍地加载太多纹理。 每当用户离开屏幕导航时,我的游戏都会处理然后初始化所有纹理。 那可能是造成问题的原因。 您需要做的是将加载的纹理/纹理图集保留在内存中(不要丢失其参考)。 这样,导航回屏幕不会重新加载所有纹理。
避免使用raw Texture
,而应使用POT(2的幂) TextureAtlas
。
我将把这两个步骤应用于我的项目,如果问题消失了,我会回来确认我的解决方案。
那根本不是问题。 我进行了很长的处理和加载纹理的循环,没有引发异常/错误。 我上面的建议不是解决方案。 该问题可能与Screen
切换过多有关,但我猜不是这样,因为当将屏幕方向从纵向模式反复更改为横向模式时,也会发生此问题,反之亦然。
我认为Game
的setScreen(screen)
调用Screen
的dispose()
(事实并非如此)。 dispose()
用于处理我所有的基础纹理。 我只是通过在Screen
的hide()
重写方法中调用dispose()
来解决问题。
使用TextureAtlas
非常重要,因为可以减少附加到每个Texture
的句柄数量 。 (这可能是EGL_SUCCESS错误的原因)
在GT-S5830
和GT-S5830i
(三星Galaxy Ace和三星Galaxy Y)上进行了测试。 问题不再发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.