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.