在我的游戏中,我需要在游戏中加载纹理(在角色自定义屏幕中,用于加载不同的皮肤)。但是当我这样做时,UI被阻止了。这是代码:
private static void loadSkinTextureRegions(){
sTexture.clearTextureAtlasSources();
sTextureRegionA = BitmapTextureAtlasTextureRegionFactory.createFromAsset(sTexture, context, getFileNameA(), 0, 0);
sTextureRegionB = BitmapTextureAtlasTextureRegionFactory.createFromAsset(sTexture, context, getFileNameB(), 0, 406);
}
所以我想:“我可以使用AsyncTask运行此代码”。所以我尝试了,现在UI没有被阻止但是......有时纹理没有被加载,并且不知道为什么!?
有什么方法可以在不阻塞线程的情况下加载纹理?
编辑:使用AsyncTask进行纹理更改,有时我会收到此错误:
09-20 09:43:59.218: E/AndroidRuntime(21976): FATAL EXCEPTION: GLThread 1622
09-20 09:43:59.218: E/AndroidRuntime(21976): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
09-20 09:43:59.218: E/AndroidRuntime(21976): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
09-20 09:43:59.218: E/AndroidRuntime(21976): at java.util.ArrayList.get(ArrayList.java:308)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas.writeTextureToHardware(BitmapTextureAtlas.java:152)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.opengl.texture.Texture.loadToHardware(Texture.java:137)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.opengl.texture.Texture.reloadToHardware(Texture.java:162)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.opengl.texture.TextureManager.updateTextures(TextureManager.java:239)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.engine.Engine.onDrawFrame(Engine.java:613)
09-20 09:43:59.218: E/AndroidRuntime(21976): at org.andengine.opengl.view.EngineRenderer.onDrawFrame(EngineRenderer.java:105)
09-20 09:43:59.218: E/AndroidRuntime(21976): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1525)
09-20 09:43:59.218: E/AndroidRuntime(21976): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1242)
如果我这样做同步,效果很好,但它会阻止线程,这很烦人
答案 0 :(得分:0)
尝试在每次创建纹理区域后加载纹理。 在你的情况下
private static void loadSkinTextureRegions(){
sTexture.clearTextureAtlasSources();
sTextureRegionA = BitmapTextureAtlasTextureRegionFactory.createFromAsset(sTexture, context, getFileNameA(), 0, 0);
sTextureRegionB = BitmapTextureAtlasTextureRegionFactory.createFromAsset(sTexture, context, getFileNameB(), 0, 406);
sTexture.load();
}
并且您也可以在UI线程中放置loadSkinTextureRegions()。