![](/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.