我正在用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?我在开发早期没有遇到过这个问题。感谢所有的帮助,谢谢!
答案 0 :(得分:1)
我最好的猜测是,在Android上调用list()
非常慢,因为它从压缩的apk(see here)中读取文件,所以如果你的资产目录有很多子目录,它耗费了很多时间。
简单的解决方案是在listf()
方法返回一次之后才调用render()
方法(可能已经绘制了加载屏幕)。但这并没有解决不必要的30秒等待。
由于资源文件夹中的文件在编译之前是已知的,因此我建议编写一个脚本来扫描assets文件夹并创建一个列出所有路径的文本文件。您可以将此文件放在资源目录的根目录下,并使用listf
方法读取它以快速获取文件路径列表。 Here's an example script.在开发过程中,您可以将此脚本设置为在运行桌面版时自动运行。