有关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,如需转载请自行联系原作者

相关文章
|
7月前
|
缓存 Ubuntu JavaScript
踩坑记录:QML加载图片资源
踩坑记录:QML加载图片资源
867 0
|
7月前
|
Android开发 开发者
Android开发之通过渲染纹理展示地球仪
该文阐述了如何使用OpenGL为三维物体添加纹理,以增强其真实感。纹理坐标是二维的,用于标记摊平后的“布料”对应物体的哪个部位,类似裁缝制作衣服的过程。在OpenGL中,启用纹理和深度测试是关键,还包括设置纹理参数、分配纹理编号、绑定位图材质等步骤。计算材质的纹理坐标后,通过`glDrawArrays`结合顶点和纹理坐标逐个贴图。最终示例展示了将世界地图贴到球体上形成逼真的地球仪效果。通过控制旋转、平移和缩放,能实现简单的三维动画效果。
87 2
Android开发之通过渲染纹理展示地球仪
|
小程序 JavaScript API
小程序图片渲染
小程序图片渲染
112 0
|
小程序 JavaScript
如何给小程序页面加载一张背景图片
如何给小程序页面加载一张背景图片
196 0
|
小程序 UED
微信小程序轮播图image控件图片mode属性自适应及解决图片加载闪烁bug
微信小程序轮播图image控件图片mode属性自适应及解决图片加载闪烁bug
426 0
|
小程序 JavaScript 前端开发
小程序实现滚动加载(懒加载)
小程序是一项很受欢迎的技术,随着其能力的不断增强,越来越多的人开始使用小程序来完成各种任务。当我面面临一个页面有非常多的数据时,该如何处理呢,显然一次性全部加载完,会非常消耗性能的,为了解决这些问题从而出现了一种叫滚动加载的数据处理方式,也被称为“无限滚动”或“懒加载”,它可以使你的页面在不刷新的情况下连续加载更多数据。在本文中,我们将讨论如何在小程序中实现滚动加载。
301 0
|
小程序 JavaScript 前端开发
小程序封装加载动画
在小程序的开发中,页面的加载过程可能会因为网络状况的不好或数据量的过大而显得非常缓慢,这时候加上一个加载动画就能有效的缓解用户的等待焦虑感。而对于应用的多个页面来说,使用全局加载动画可以提高用户体验,让应用显得更加美观和专业。本篇技术分享博客将为大家介绍在小程序中封装全局加载动画的具体实现步骤,帮助您提高小程序的用户体验。通过上述步骤,我们就完成了小程序中封装全局加载动画的具体实现方法。在实际开发中,我们可以根据实际需求对组件样式和方法进行调整和修改,以满足不同的开发需求。
272 0
关于 qml开发中使用Image元素切换图片闪黑屏 的解决方法
关于 qml开发中使用Image元素切换图片闪黑屏 的解决方法
|
JavaScript
小视频源码,Js动画缓慢效果实现
小视频源码,Js动画缓慢效果实现
570 0
|
图形学
Unity跳转场景进度条制作教程(异步加载)
Unity跳转场景进度条制作 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— ...
2144 0

热门文章

最新文章