Графика занимает 0,5 ГБ памяти в libgdx - PullRequest
0 голосов
/ 31 марта 2020

Я занимаюсь разработкой простой 2D-игры. У меня есть несколько спрайтов. Каждый спрайт имеет около 80 png / кадров размером 265 * 256. Я использовал упаковщик текстур LibGdx для упаковки атласа. Включаю mimap, используя следующий код для pa c

TexturePacker.Settings settings = new TexturePacker.Settings();
settings.combineSubdirectories = true;
settings.filterMin = Texture.TextureFilter.MipMapNearestLinear;
settings.filterMag = Texture.TextureFilter.Linear;

TexturePacker.process(settings, f.getPath(), outputFolderName, atlasFileName);

Вопросы:

  1. 80 изображений / кадров для одного спрайта слишком много?
  2. Является ли 0,5 Использование ГБ памяти слишком велико для простой игры, такой как Fruit ninja?
  3. Как я могу уменьшить использование памяти?
  4. Любые другие вещи, которые я должен попробовать?

Update1 : Вот снимок экрана, сделанный из android profiler. enter image description here

1 Ответ

0 голосов
/ 06 апреля 2020

80 кадров довольно много, но это число никогда не было проблемой в моих проектах. Тем не менее, большинство наших 60-кадровых предварительно визуализированных анимаций маленькие, как мигающий значок графика c в сегментах 48x48, с одним листом (так что переключение контекста минимально). Это никогда не было проблемой производительности для нас ... НО вы говорите, что 256x256 меня немного пугает, особенно если он не обрезан и создается много png-файлов!

В то время как мои проекты имеют спрайты с одинаковыми номерами кадров, они были оптимизированы с помощью Texture Packer . Убедитесь, что для режима обрезки установлено значение «Обрезка» и что оно не «Нет» (настройка находится внизу в разделе «Спрайты»). Этот параметр будет де-гомогенизировать 256x256 в меньшие части, если это вообще возможно, уменьшая общее количество листов и текстурных привязок (я думаю, а также меньше переключений контекста) .. Я не совсем уверен, как вы упаковали свои спрайты или если они могут даже быть обрезаны, но это может потенциально быть спасением жизни.

Позвольте мне показать вам пример:

До enter image description here

После

enter image description here

Также, если вы предоставили код для создания анимации, мы могли бы перепроверьте, чтобы убедиться, что вы не связываете 80 текстур, когда потребуется только 1. Я создаю свои анимации с помощью следующего процесса:

TextureAtlas atlas = assetManager.get(atlas_name);
Sprite[] spriteFrames = new Sprite[numFrames];

for (int index=0; index<numFrames; index++) {
    if (atlas.findRegion(lookup_name, index) == null)
        Engine.console("[ERROR] problem loading and finding region for " + atlas_name + " " + lookup_name + " index: " + index + " not found in spritesheet .. fix immediately");
    else {
        spriteFrames[index] = atlas.createSprite(lookup_name, index);
    }
}
Animation<Sprite> animation = new Animation<Sprite>(timeBetweenFrames, spriteFrames);

Я надеялся, что это помогло дать некоторое представление.

...