【问题标题】:Java LibGDX - Black Screen Appears for a Stupid Long Period Before Loading ScreenJava LibGDX - 在加载屏幕之前出现长时间的黑屏
【发布时间】:2017-03-07 18:37:19
【问题描述】:

我正在用 LibGDX/Java 创建一个游戏。当游戏启动时,它会加载“assets”文件夹中的所有资产。在执行此操作之前,它会在加载资产时加载一个图像以用作加载图像。这在桌面上运行得非常好,但在 android 上启动时,黑屏会显示大约 30 秒,然后才会绘制加载图像并开始加载资源。

我目前的代码如下:

LoadingState.java:

public void render(SpriteBatch batch) {
    if (!loadedBg) {
        GameManager.getInstance().assetManager.finishLoadingAsset("gui/constant/menuBg.png");
        loadedBg = true;
    }

    Texture background = gameManager.assetManager.get("gui/constant/menuBg.png", Texture.class);    // Set background image

    /* Drawing */
    batch.draw(background, 0, 0);
}

资产.java:

/** Loads all assets from the asset directories */
public void load() {

    List<FileHandle> allFiles = new ArrayList<FileHandle>();    // This will contain all the files in all the subdirectories.

    for(FileHandle dir : assetDirs) {
        allFiles.addAll(FileUtils.listf(dir.path()));
    }

    for(int i = 0; i < allFiles.size(); i++) {
        if(allFiles.get(i).name().startsWith("._")) {
        allFiles.remove(i);
        }
    }

    /* Iterate through all the files and load only the png ones */
    for(FileHandle f : allFiles) {

        if(f.name().endsWith(".png")) {             // Found an image file; load it as a texture
        manager.load(f.path(), Texture.class);
        }

    }

}

编辑: 添加了 FileUtils 类 FileUtils.java:

/** Returns all files from a directory */
public static List<FileHandle> listf(String directoryName) {
    FileHandle directory = Gdx.files.internal(directoryName);

    List<FileHandle> resultList = new ArrayList<FileHandle>();

    // Get all the files from a directory
    FileHandle[] fList = directory.list();
    resultList.addAll(Arrays.asList(fList));
    for (FileHandle file : fList) {
        if (file.isDirectory()) {
            resultList.addAll(listf(file.path()));
        }
    }
    return resultList;
}

这是整个 android 应用程序的问题吗?还是只有 LibGDX?我在开发的早期没有遇到这个问题。感谢您提供任何和所有帮助,谢谢!

【问题讨论】:

  • render() 方法第一次返回之前,您必须做一些耗时的事情。在这里看不到足够的代码来确定是什么。 FileUtils 是来自 Apache Commons,还是你自己的类?
  • @Tenfour04 感谢您检查我的代码,抱歉回复延迟。我继续添加 FileUtils 类供您查看。渲染类是 LoadingState.java 部分中显示的内容,我认为不会运行任何耗时的操作,因为如果是这种情况,它也会在桌面上显示黑屏。在当前状态下,黑屏仅出现在 android 而不是桌面上。感谢任何帮助

标签: java libgdx loading file-management


【解决方案1】:

我最好的猜测是,在 Android 上调用 list() 在目录上非常慢,因为它会从压缩的 apk (see here) 中读取文件,因此如果您的资产目录有很多子目录,那么它是浪费了很多时间。

简单的解决方案是在render() 方法返回一次(可能已经绘制了加载屏幕)之后才调用您的listf() 方法。但这并没有解决不必要的 30 秒等待。

由于 assets 文件夹中的文件在编译之前是已知的,我建议编写一个脚本来扫描 assets 文件夹并创建一个列出所有路径的文本文件。您可以将此文件放在资产目录的根目录下,并在 listf 方法中读取它,以快速获取文件路径列表。 Here's an example script. 在开发过程中,您可以将此脚本设置为在您运行桌面版本时自动运行。

【讨论】:

  • 谢谢!这正是问题所在。你把我引向了正确的方向
猜你喜欢
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多