Java LibGDX - 在加载屏幕之前黑屏出现很长一段时间

标签 java libgdx loading file-management

我正在 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);
}

Assets .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?我在开发早期并没有遇到这个问题。感谢您的任何帮助,谢谢!

最佳答案

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

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

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

关于Java LibGDX - 在加载屏幕之前黑屏出现很长一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655790/

相关文章:

java - Spring:使用 BadRequest 处理不明确的映射

java - ArrayList 对象

c - 图片加载、C语言和GTK

android - 使用 jPCT-AE 加载 3d 模型

react-native - 如何使用 React Native 在屏幕中间显示加载进度或微调器?

java - 为什么此代码出现 "unreachable statement"错误?

java - Android 应用始终在工具栏中显示应用名称

java - LibGDX 光传感器数据

android - Box2D(LibGDX) - 球的奇怪行为

java - 按下多个键时,libGDX InputProcessor 无法正常运行