应用程序在再次打开时加载错误的纹理

2022-09-04 23:20:14

我正在使用libgdx库开发一款游戏。

当我第一次加载程序时,纹理加载完美,一切都很好

enter image description here

当我关闭应用程序并再次加载它时(我假设Android以某种方式从内存中缓存它) - 加载错误的纹理。

enter image description here

如果我从历史记录中清除游戏,然后重试,它可以完美地工作。

-- 它目前的工作方式如下 - 我使用 a 来绘制实际的游戏。我有单独的s来绘制背景和界面(加载得很好)。在处理一个关卡时,我释放 .SpriteBatchSpriteBatcheSpriteBatch

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);
        }

--

我使用我自己编写的缓存加载纹理,以防止多次加载相同的图像。我在创建应用程序时清除缓存。然后,我在对象本身中保留纹理/纹理区域,该纹理/纹理区域通过以下方式获得.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()  ); 
    }

这有效,但很脏。

当进程由于异常而失败时,不会发生错误。


我猜想库以某种方式缓存了自己的纹理,这些纹理以某种方式被损坏了,但我不知道如何检查,也不知道如何清除它们。

那么,有什么想法吗?


答案 1

您需要 Dispose() 您创建的所有纹理,以便循环遍历其所有 value() 并将其放在单独的方法上,然后在主游戏的屏幕 dispose() 函数中使用该方法。textures

切换的纹理似乎是BitmapFont,如果那些在UI中使用的字体纹理,那么你可能在UI场景中有错误左右,你也加载了JSON文件吗?

在我看来,当你关闭游戏时,你的最后一个纹理是使用字体纹理,并且它填充了场景中使用的纹理。


答案 2

“新纹理”,TextureAtlas,BitmapFont等在暂停/恢复后或OpenGL上下文丢失时自动重新加载。

我猜你的问题一定是在你处理手动重新加载的方式上。

如果要确保不会多次加载纹理,请改用 AssetManager。无需手动完成所有这些操作。


推荐