簡體   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