我正在使用libgdx库开发游戏。
当我第一次加载程序时,纹理加载完美,一切都很好
当我关闭应用程序并再次加载它时(我假设Android以某种方式从内存中缓存它) - 错误的纹理被加载。
如果我从历史中清除游戏,然后再试一次,那就完美了。
-
它目前的工作方式如下 - 我使用SpriteBatch
绘制实际游戏。我有单独的SpriteBatche
来绘制背景和界面(加载得很好)。在处理关卡时,我处理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;
}
}
我附加了一个调试器,正在加载的纹理DO有正确的路径。
在图片示例中,正在交换的纹理碰巧是字体的一部分,这是我的缓存中存储的任何内容。
-
所以,我宁愿被困在这里。
现在我正在使用在处置时手动终止进程的顽皮解决方案:
@Override
public void onDestroy()
{
super.onDestroy();
this.finish();
android.os.Process.killProcess( android.os.Process.myPid() );
}
这很有用但很脏。
当进程因异常而失败时,不会发生错误。
我猜这个库在某种程度上缓存了自己的纹理,这些纹理在某种程度上被破坏了,但我不知道如何检查,也不知道如何清除它们。
那么,有什么想法吗?
答案 0 :(得分:2)
你需要Dispose()你创建的所有纹理,让textures
遍历它的所有值()并将它放在一个单独的方法上,然后在主游戏的screen dispose()函数中使用该方法。
切换纹理似乎是BitmapFont,如果在UI中使用那些字体纹理,那么你可能在UI场景中有错误,那么你也在加载JSON文件吗?
在我看来,当你关闭游戏时,你的最后一个纹理是使用了字体纹理,它填充了场景中使用的纹理。
答案 1 :(得分:1)
“new Texture”,TextureAtlas,BitmapFont等会在暂停/恢复后或OpenGL上下文丢失时自动重新加载。
我猜你的问题必须在你处理手动重装的方式上。
如果您想确保不会多次加载纹理,请改用AssetManager。无需手动完成所有操作。