2017-03-07 39 views
0

我創造LibGDX/Java中的比賽之前。遊戲啓動時,它會加載「資產」文件夾中的所有資產。在執行此操作之前,它會在資產加載時加載圖像以用作加載圖像。這在桌面上運行得非常好,但在Android上啓動時,在加載圖像繪製並開始加載資源之前,黑屏將顯示約30秒。的Java LibGDX - 黑色屏幕出現一個愚蠢的長週期加載屏幕

我當前的代碼如下:

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.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

在render()方法的第一次返回之前,你必須做一些耗時的工作。在這裏看不到足夠的代碼來確定什麼。是Apache Commons的FileUtils,還是你自己的類? – Tenfour04

+0

@ Tenfour04感謝您檢查我的代碼,對於延遲迴復感到抱歉。我繼續前進,並添加了FileUtils類供您檢查。渲染類是在LoadingState.java部分顯示的內容,我不相信任何耗時的事情正在運行,因爲如果是這種情況,它也會在桌面上顯示黑屏。在目前的狀態下,黑屏只出現在android而不是桌面上。感謝任何幫助 – Flizzet

回答

1

我最好的猜測是,在一個目錄呼籲list()是在Android上速度很慢,由於它讀取文件進行壓縮的APK(see here)的,所以如果你的資產目錄中有很多子目錄,它吃起來很多時間。

簡單的解決方法是在render()方法返回一次(大概已經繪製了加載屏幕)之後才能調用listf()方法。但是這並沒有解決不必要的30秒等待。

由於在資產文件夾中的文件編譯時之前知道,我建議寫一個掃描assets文件夾,並創建具有的所有路徑的文本文件的腳本。您可以將此文件放置在您的資產目錄的根目錄中,並在您的listf方法中讀取它,以快速獲取您的文件路徑列表。 Here's an example script.在開發過程中,您可以將此腳本設置爲在運行桌面版本時自動運行。

+0

謝謝!這正是問題所在。你帶領我走向正確的方向 – Flizzet