【发布时间】:2014-01-12 12:55:20
【问题描述】:
我正在使用 libgdx 库开发游戏。
当我第一次加载程序时,纹理加载完美,一切都很好
当我关闭应用程序并再次加载它时(我假设 Android 以某种方式从内存中缓存它) - 加载了错误的纹理。
如果我从历史中清除游戏,然后再试一次,它会完美运行。
--
它目前的工作方式如下 - 我使用SpriteBatch 来绘制实际游戏。我有单独的SpriteBatches 来绘制背景和界面(加载得很好)。在处置关卡时,我处置了SpriteBatch。
for (Block block : world.getDrawableBlocks(this.width, this.height))
{
spriteBatch.draw(block.getTexture(1f), block.getPosition().x, block.getPosition().y, block.SIZE_X, block.SIZE_Y);
}
--
我使用自己编写的缓存加载的纹理,以防止多次加载同一图像。我在创建应用程序时清除缓存。然后我在对象本身中保留一个Texture/TextureRegion,它是通过.getTexture()获得的
这是我用来加载纹理的代码
public static Texture loadTexture(String path)
{
//Do we have the texture cached?
if (textures.containsKey(path))
{
//return it
return textures.get(path);
}
else
{
//load it from the filesystem
Texture texture = new Texture(Gdx.files.internal(path));
//cache it
textures.put(path, texture);
//return it
return texture;
}
}
我附加了一个调试器,并且正在加载的纹理确实有正确的路径。
在图片示例中,被交换的纹理恰好是字体的一部分,它没有存储在我的缓存中。
--
所以,我被困在这里了。
现在我正在使用手动终止进程的顽皮解决方案:
@Override
public void onDestroy()
{
super.onDestroy();
this.finish();
android.os.Process.killProcess( android.os.Process.myPid() );
}
这可行,但很脏。
当进程因异常而失败时,不会出现该错误。
我猜这个库不知何故缓存了它自己的纹理,这些纹理不知何故被破坏了,但我不知道如何检查,也不知道如何清除它们。
那么,有什么想法吗?
【问题讨论】:
-
你是在制作静态纹理还是字体???
-
不,它们不是静态的。
-
我使用的 TextureLoader 缓存是静态的,但是在创建应用程序时,我特别清除了我正在使用的 hashmap。你认为这可能是个问题吗?
-
你是在主线程中加载纹理还是有一个自定义线程?我写了一个自定义线程来加载纹理,它们似乎坏了,但没有发生这样的事情。任何并发加载都可能是原因。
-
我在整个应用程序中只使用一个线程。