2017-03-07 3 views
0

Je crée un jeu en LibGDX/Java. Lorsque le jeu se lance, il charge tous les actifs dans le dossier "assets". Avant cela, il charge une image à utiliser comme image de chargement pendant le chargement des actifs. Cela fonctionne parfaitement sur le bureau, mais lors du lancement sur Android, un écran noir s'affiche pendant environ 30 secondes avant que l'image de chargement ne dessine et que les actifs commencent à se charger.Java LibGDX - L'écran noir apparaît pendant une longue période stupide avant le chargement de l'écran

Mon code actuel est le suivant:

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); 
     } 

    } 

} 

EDIT: Ajouté la classe 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; 
} 

Est-ce un problème avec les applications Android dans leur ensemble? Ou seulement LibGDX? Je n'avais pas ce problème plus tôt dans le développement. Toute aide est appréciée, merci!

+0

Vous devez faire quelque chose qui prend beaucoup de temps avant le premier retour de la méthode 'render()'. Vous ne pouvez pas voir assez de votre code ici pour déterminer quoi. Est-ce que FileUtils provient d'Apache Commons, ou est-ce votre propre classe? – Tenfour04

+0

@ Tenfour04 Merci de vérifier mon code, désolé pour la réponse différée. Je suis allé de l'avant et ajouté la classe FileUtils pour vous de vérifier. La classe de rendu est ce qui est montré dans la section de LoadingState.java et je ne crois pas que quelque chose de long soit couru, parce que si c'était le cas cela montrerait également un écran noir sur le bureau. Dans son état actuel, l'écran noir apparaît uniquement sur Android et non sur le bureau. Appréciez toute aide – Flizzet

Répondre

1

Ma meilleure estimation est que l'appel list() sur un répertoire est très lent sur Android en raison de sa lecture des fichiers d'un apk compressé (see here), et donc si votre répertoire d'actifs a de très nombreux sous-répertoires, il est en train de manger un beaucoup de temps.

La solution facile serait de ne pas appeler votre méthode listf() jusqu'à ce que la méthode render() soit retournée une fois (probablement après avoir dessiné votre écran de chargement). Mais cela ne répond pas à l'attente inutile de 30 secondes. Comme les fichiers du dossier assets sont connus avant la compilation, je suggère d'écrire un script qui scanne le dossier assets et crée un fichier texte avec tous les chemins listés. Vous pouvez placer ce fichier à la racine de votre répertoire d'actifs et le lire dans votre méthode listf pour obtenir rapidement votre liste de chemins de fichier. Here's an example script. Au cours du développement, vous pouvez définir ce script pour qu'il s'exécute automatiquement lorsque vous exécutez votre version de bureau.

+0

Merci! C'était exactement ce que le problème était. Tu m'as conduit dans la bonne direction – Flizzet