【问题标题】:Application loading the wrong textures on opening again应用程序在再次打开时加载错误的纹理
【发布时间】: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。你认为这可能是个问题吗?
  • 你是在主线程中加载纹理还是有一个自定义线程?我写了一个自定义线程来加载纹理,它们似乎坏了,但没有发生这样的事情。任何并发加载都可能是原因。
  • 我在整个应用程序中只使用一个线程。

标签: java android libgdx


【解决方案1】:

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

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

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

【讨论】:

  • 这对我有用。我浏览了我的“textureLoader”并处理了所有纹理,问题没有再次出现。我猜当对象本身丢失时它不会自动处理它们。
【解决方案2】:

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

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

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

【讨论】:

  • 我的问题是程序退出并再次打开时。当用户暂停应用程序并继续它时,我没有问题。当用户关闭应用程序时,执行其他操作然后再次打开它 - 出现问题。现在纹理实际上再次创建(我跟随调试器)并通过正确的代码片段 - 只是当它到达绘制它们时......
  • 将代码发布在您首次创建它们的位置以及何时重新加载它们
  • 你如何缓存它们?似乎缓存的纹理也丢失了。
  • 我将它们存储在哈希图中。如果我需要相同的纹理,我只需从内存中返回一个,而不是从磁盘中返回。但是同样,我在加载程序时清除了缓存,只有在关闭程序并再次打开时才会出现这个问题。加载关卡或其他什么时我没有这个问题。
  • 我很确定您的问题是缓存中的纹理也丢失了。不要缓存它们。实际上,我不认为将它们放在哈希图中算作缓存:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多