有关libgdx异步加载导致图片显示异常的解决

简介:

   最近原来的游戏趋于稳定,一些小问题慢慢被玩家提及越来越多。图片显示异常的问题很早就有,但是极少出现,最近抽空重点检查了一下。总算搞定了,特别记录一下。

   通过一直以来玩家反馈的数据,我找了一下规律,错误都是弹出框,并且大部分都是游戏的消息框。还有一个共性就是所有的错误都是在异步线程中引发的。比较奇怪的是在lwjgl中是直接报错,但是在android中是图片显示异常。最后总算捕获到该异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
com.badlogic.gdx.utils.GdxRuntimeException: java.lang.RuntimeException: No OpenGL context found  in  the current thread.
     at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java: 471 )
     at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java: 316 )
     at com.dreamoe.pirateage.client.ApkAssets.loading(ApkAssets.java: 82 )
     at com.dreamoe.pirateage.client.ApkAssets. get (ApkAssets.java: 54 )
     at com.dreamoe.pirateage.client.Assets. get (Assets.java: 229 )
     at com.dreamoe.pirateage.client.actor.impl.window.TipWindow.<init>(TipWindow.java: 30 )
     at com.dreamoe.pirateage.client.actor.impl.window.TipWindow.show(TipWindow.java: 48 )
     at com.dreamoe.pirateage.client.aop.RemoteAspect.invoke(RemoteAspect.java: 86 )
     at $Proxy0.registerUser(Unknown Source)
     at com.dreamoe.pirateage.client.manager.remote.Remote.registerUser(Remote.java: 1248 )
     at com.dreamoe.pirateage.client.actor.impl.window.RegisterWindow$ 1 $ 1 .doInRegisterWindow.java: 187 )
      at com.dreamoe.pirateage.client.thread.AsyncWaitThread.run(AsyncWaitThread.java: 29 )
Caused by: java.lang.RuntimeException: No OpenGL context found  in  the current thread.
     at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java: 124 )
     at org.lwjgl.opengl.GL11.glGenTextures(GL11.java: 1468 )
     at com.badlogic.gdx.backends.lwjgl.LwjglGL10.glGenTextures(LwjglGL10.java: 240 )
     at com.badlogic.gdx.graphics.Texture.createGLHandle(Texture.java: 166 )
     at com.badlogic.gdx.graphics.Texture.create(Texture.java: 158 )
     at com.badlogic.gdx.graphics.Texture.<init>(Texture.java: 154 )
     at com.badlogic.gdx.assets.loaders.TextureLoader.loadSync(TextureLoader.java: 84 )
     at com.badlogic.gdx.assets.loaders.TextureLoader.loadSync(TextureLoader.java: 1 )
     at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java: 130 )
     at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java: 94 )
     at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java: 399 )
     at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java: 314 )
     ...  10  more

   通过不断模拟假设并验证,最后发现我写了一个异步线程去做服务器交互,主界面锁定等待。当在这个异步线程中做了assetManager.loading的动作去加载新的图片,这其实就不是在主线程做的,因而导致图片加载异常。由于程序中图片有缓存,所以才导致只有加载一次图片资源就不会出错。结果这个缓存搞的现象变得更难识别。

   其实本身还是一个很简单的问题,还是找到重现不走,再分析清楚。



本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/1215093,如需转载请自行联系原作者

相关文章
|
人工智能 算法 编译器
C语言初阶测评题:测试你的基础知识和编程技能!!
C语言初阶测评题:测试你的基础知识和编程技能!!
332 1
|
2月前
|
人工智能 编解码 前端开发
Upscayl 开源神级放大器!一键把 480p 老照片变 4K,本地跑图不花一分钱!
Upscayl是一款免费开源的AI图像放大工具,支持本地离线运行,利用Real-ESRGAN技术将低清图一键放大至4K,兼容老照片、插画、截图等,保护隐私且全平台可用。
410 41
|
6月前
|
SQL Java 数据库连接
updateByPrimaryKeySelective()方法因字段为null导致的更新不成功问题解决办法
为了让这个解决方案更容易融入到现有系统中,其实现应该尽量简单且无缝,避免重复代码,并提高代码复用性。结合上述方法中提供的策略,应可以解决在使用 `updateByPrimaryKeySelective()`方法时因字段为null导致的更新不成功问题。请根据实际业务需求和上下文选择最合适的方案。这样的解决方案能够达到更佳的代码质量和维护性。
547 14
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
551 24
|
物联网
BLE 0x3e HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH
BLE 0x3e HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH
261 0
|
存储 前端开发 JavaScript
Webpack【Webpack中模式(Mode)、Webpack中使用DevServer、Webpack中devtool增强调试过程】(二)-全面详解(学习总结---从入门到深化)
Webpack【Webpack中模式(Mode)、Webpack中使用DevServer、Webpack中devtool增强调试过程】(二)-全面详解(学习总结---从入门到深化)
695 0
|
存储 文字识别 算法
解析!文档扫描 SDK 中的高级图像处理技术
本博客讨论了图像质量在文档扫描中的重要性,解决了扫描过程中遇到的常见挑战,以及文档扫描 SDK 利用先进的图像处理技术来应对这些挑战。
|
存储 移动开发 关系型数据库
HarmonyOS 鸿蒙面试第一弹
HarmonyOS 鸿蒙面试第一弹
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
379 0
|
Linux 开发工具 Windows
在WSL2中安装IntelliJ IDEA开发工具
在WSL2中安装IntelliJ IDEA开发工具
1629 2