LibGDX: медленная загрузка текстуры на устройство Android (продолжайте вызывать сборщик мусора)

Я создаю игру, которая должна иметь 27 анимаций в памяти, так как мне нужно показывать их сразу после того, как пользователь приклеил экран.

При запуске настольной версии приложения она работает нормально, но время загрузки на устройство с Android слишком велико (более 3 минут).

Я вижу, что сборщик мусора часто вызывается во время загрузки анимаций (но они все еще работают после завершения).

это код, который я использую для загрузки анимации:

private static void loadLetterAnimation(String letter){
    Gdx.app.log("AssetLoader", "Loading letter animation for " + letter);
    Array currentLetterTextures = new Array();
    Array currentLetterTexturesRegions = new Array();
    FileHandle dirHandle = Gdx.files.internal("keys/animations/" + letter + "/");
    for (int j = 0; j < 30; j++) {
        Texture texture = new Texture(Gdx.files.internal("keys/animations/" + letter + "/" + j + ".png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
        TextureRegion textureRegion = new TextureRegion(texture, 0, 0, texture.getWidth(), texture.getHeight());
        textureRegion.flip(false, true);
        currentLetterTextures.add(texture);
        currentLetterTexturesRegions.add(textureRegion);
    }
    Animation animation = new Animation(0.04f, currentLetterTexturesRegions);
    animation.setPlayMode(Animation.PlayMode.NORMAL);
    letterAnimationsTexturesMap.insert(letterAnimationsTexturesMap.size, letter, currentLetterTextures);
    letterAnimationsMap.insert(letterAnimationsMap.size, letter, animation);
}

и журналы:

...
02-09 22:08:24.383  25272-25305/com.testing.android I/AssetLoader﹕ Loading letter animation for a
02-09 22:08:25.843  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 373K, 16% free 9547K/11271K, paused 12ms+2ms, total 27ms
02-09 22:08:29.368  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 405K, 16% free 9549K/11271K, paused 2ms+1ms, total 24ms
02-09 22:08:32.813  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 400K, 16% free 9555K/11271K, paused 12ms+2ms, total 39ms
02-09 22:08:33.263  25272-25305/com.testing.android I/AssetLoader﹕ Loading letter animation for b
02-09 22:08:36.498  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 397K, 16% free 9559K/11271K, paused 2ms+3ms, total 29ms
02-09 22:08:40.488  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 454K, 16% free 9565K/11271K, paused 12ms+2ms, total 40ms
02-09 22:08:42.073  25272-25305/com.testing.android I/AssetLoader﹕ Loading    letter animation for c
02-09 22:08:45.323  25272-25276/com.testing.android D/dalvikvm﹕ GC_CONCURRENT freed 451K, 16% free 9567K/11271K, paused 12ms+2ms, total 39ms
...

Может кто-нибудь сказать, пожалуйста, что я делаю не так? это вообще возможно сделать?

1 ответ

Решение

Упакуйте текстуры в Атлас (или набор атласов). Это уменьшит время загрузки, потому что вы будете искать меньше файлов, открывать меньше файлов, загружать больше данных в графический процессор за один раз и улучшать время выполнения (благодаря меньшему количеству загруженных текстур, что приведет к гораздо меньшему переключению текстур). См. https://github.com/libgdx/libgdx/wiki/Texture-packer.

flip операция тоже дорогая. Вы должны быть в состоянии настроить свои текстуры, чтобы быть "перевернутыми" заранее.

Перед этим, вероятно, стоит использовать один из инструментов анализа кучи, чтобы выяснить, куда на самом деле уходит ваша память и время. См. http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html.

Другие вопросы по тегам