2017-03-07 1 views
0

LibGDX/Java에서 게임을 만들고 있습니다. 게임이 시작되면 "assets"폴더에 모든 자산을로드합니다. 이렇게하기 전에 애셋이로드되는 동안 이미지를로드하여로드 이미지로 사용합니다. 데스크톱에서 완벽하게 작동하지만 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의 클래스 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; 
} 

전체적으로 안드로이드 응용 프로그램에 문제가 있습니까? 아니면 LibGDX 만? 나는 개발 초기에이 문제를 안고 있었다. 모든 도움을 주시면 고맙습니다. 감사합니다.

+0

'render()'메소드를 처음으로 반환하기 전에 시간을 많이 소비해야합니다. 무엇을 결정하기 위해 여기에 충분한 코드를 볼 수 없습니다. Apache Commons의 FileUtils인가요, 아니면 자신의 클래스입니까? – Tenfour04

+0

@ Tenfour04 제 코드를 확인해 주셔서 감사합니다. 늦어서 반갑습니다. 체크 아웃 할 FileUtils 클래스를 추가했습니다. 렌더링 클래스는 LoadingState.java 섹션에 표시되는 것으로, 시간이 많이 걸리는 것은 아무 것도 믿지 않습니다. 그렇다면 바탕 화면에 검은 색 화면이 표시 될 수 있기 때문입니다. 현재 상태에서 검은 색 화면은 Android가 아닌 바탕 화면에만 나타납니다. 감사합니다. – Flizzet

답변

1

압축 된 apk (see here)에서 파일을 읽으므로 디렉토리에서 list()을 호출하는 것이 매우 느립니다. 따라서 에셋 디렉토리에 매우 많은 하위 디렉토리가있는 경우 많은 시간.

간편한 해결책은 listf() 메서드를 render() 메서드가 한 번 반환 될 때까지 (아마도로드하는 화면을 그렸을 때까지) 호출하지 않는 것입니다. 그러나 이것은 불필요한 30 초 대기를 해결하지 못합니다.

assets 폴더의 파일은 컴파일 타임 전에 알려 지므로 assets 폴더를 검색하고 모든 경로가 나열된 텍스트 파일을 만드는 스크립트를 작성하는 것이 좋습니다. 이 파일을 자산 디렉토리의 루트에 넣고 메소드에서 읽을 수 있으므로 파일 경로 목록을 빨리 얻을 수 있습니다. Here's an example script. 개발하는 동안 데스크톱 버전을 실행할 때이 스크립트가 자동으로 실행되도록 설정할 수 있습니다.

+0

감사합니다! 이것은 정확히 문제가 무엇인지에 대한 것입니다. 너는 나를 올바른 방향으로 인도했다. – Flizzet

관련 문제