Javalibgdx-在加载屏幕之前,黑屏会出现很长一段时间

Javalibgdx-在加载屏幕之前,黑屏会出现很长一段时间,java,libgdx,loading,file-management,Java,Libgdx,Loading,File Management,我正在用LibGDX/Java创建一个游戏。当游戏启动时,它会加载“资产”文件夹中的所有资产。在执行此操作之前,它将加载一个图像,以便在加载资源时用作加载图像。这在桌面上运行得非常好,但在android上启动时,在加载图像绘制和资源开始加载之前,将显示大约30秒的黑屏 我目前的代码如下: LoadingState.java: public void render(SpriteBatch batch) { if (!loadedBg) { GameManager.getIn

我正在用LibGDX/Java创建一个游戏。当游戏启动时,它会加载“资产”文件夹中的所有资产。在执行此操作之前,它将加载一个图像,以便在加载资源时用作加载图像。这在桌面上运行得非常好,但在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);
        }

    }

}
/**从资产目录加载所有资产*/
公共空荷载(){
List allFiles=new ArrayList();//这将包含所有子目录中的所有文件。
用于(文件句柄目录:assetDirs){
allFiles.addAll(FileUtils.listf(dir.path());
}
对于(int i=0;i
编辑: 添加了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;
}
/**返回目录中的所有文件*/
公共静态列表listf(字符串目录名){
FileHandle directory=Gdx.files.internal(directoryName);
List resultList=new ArrayList();
//从目录中获取所有文件
FileHandle[]fList=directory.list();
addAll(Arrays.asList(fList));
for(文件句柄文件:fList){
if(file.isDirectory()){
addAll(listf(file.path());
}
}
返回结果列表;
}

这是安卓应用程序整体上的问题吗?还是只有LibGDX?我在开发早期没有遇到这个问题。非常感谢您的帮助,谢谢

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

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


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

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