我有安卓游戏,使用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,
答案 0 :(得分:6)
已报告此问题here before。已经提交了an issue。
您可以通过提供此问题的更多详细信息来提供帮助。
答案 1 :(得分:1)
我做了一些研究,发现这个问题出现在低端设备中,因为它们的内存很低。在两次场景崩溃之间加载和卸载纹理SwapBuffer并因此抛出此运行时异常。
关于这个问题最烦人的事情是,当我在这些设备上测试时,我没有得到任何这样的错误,但在Playstore中我收到的报告太多了。
因此,我们可以通过两种方式解决这个问题:
1)从兼容列表中过滤掉低端设备。
2)使用UncaughtExceptionHandler()
捕获异常并告诉用户低内存问题。
答案 2 :(得分:0)
上次修改时的解决方案。
它实际上也发生在我的低端设备上(GT-S5830
和GT-S5830i
)。
System.gc()
,暗示垃圾收集器释放了一些ram空间。
我没有解决方法,但会在找到答案后立即更新此答案。
在一些搜索之后,垃圾收集器不管理与gpu相关的东西(如纹理)(这就是为什么它们应该手动处理)。所以调用System.gc()
在某种程度上毫无意义。不过,我正在处理我的所有纹理,而且我的游戏的内存使用率非常低。
我尝试了各种各样的解决方案并且没有任何工作但是这里应该解决问题(没有尝试过这个,但应该可以工作):
只是不要一遍又一遍地加载这么多纹理。我的游戏用于处理,然后在用户离开屏幕时初始化所有纹理。这可能会导致问题。你需要做的是将加载的纹理/纹理地图集保存在内存中(不要丢失它们的引用)。这样,导航回屏幕就不会重新加载所有纹理。
避免使用原始Texture
,而是使用 POT(2的幂) TextureAtlas
。
我会将这两个步骤应用到我的项目中,如果问题消失,我会回来确认我的解决方案。
这根本不是问题。我运行了一个非常长的处理和加载纹理循环,没有抛出异常/错误。我的上述建议不是解决方案。这个问题可能与过度Screen
切换有关,但我猜不会因为在从纵向模式到横向模式重复更改屏幕方向时也会出现此问题,反之亦然。
我认为Game
的{{1}}会自动调用setScreen(screen)
的{{1}}(事实并非如此)。 Screen
用于处理我所有的底层纹理。 我只是通过在dispose()
的{{1}}覆盖方法中调用dispose()
来解决问题。
使用dispose()
非常重要,因为您减少了附加到每个Screen
的句柄数量。 (这可能是EGL_SUCCESS错误的原因)
在hide()
和TextureAtlas
(三星Galaxy Ace和三星Galaxy Y)上进行了测试。问题不再发生。