Утечка памяти с BitmapFont

В настоящее время я работаю над приложением для Android с использованием LibGDX и точно определил утечку памяти с помощью этого метода. Может ли кто-нибудь помочь мне понять, откуда это? Я пытался оглянуться назад с помощью собственных методов LibGDX, но все еще не могу найти, где находится утечка. Спасибо

private void drawScore() {
    scoreLength = ("" + myWorld.getScore()).length();
    AssetLoader.shadow.draw(batcher, "" + myWorld.getScore(),
            165 - (3 * scoreLength), midPointY - 82);
    AssetLoader.font.draw(batcher, "" + myWorld.getScore(),
            165 - (3 * scoreLength) - 1, midPointY - 83);
}

person Michael    schedule 09.10.2016    source источник
comment
Может быть что угодно... Возможно, вы в какой-то момент удалили диспетчер активов, или диспетчер активов является статическим, что может вызвать проблемы с жизненным циклом Android. Возможно вы не правильно загружаете шрифты. Не могли бы вы предоставить нам больше кода?   -  person Marius    schedule 09.10.2016
comment
Много ли течет? Если нет, это может быть просто String concat, который вы делаете, так как я думаю, что этот drawScore() выполняется каждый кадр? Попробуйте вместо этого использовать StringBuilder и посмотрите, станет ли он лучше. Если это не так, нам нужно будет увидеть AssetLoader.shadow.draw() и AssetLoader.font.draw()   -  person Andreas Toresäter    schedule 10.10.2016
comment
Как определили, что есть утечка? Вы просто имеете в виду, что GC здесь активен?   -  person Tenfour04    schedule 10.10.2016
comment
Похоже, Корпен был прав, эффект, который я описал выше, создавался конкатом. Я собираюсь попробовать переделать это с помощью StringBuilder. Спасибо!   -  person Michael    schedule 12.10.2016


Ответы (1)


Лучше всего было бы предварительно вычислить все ваши данные, чтобы рендеринг не выполнял конкатенацию строк или другие операции.

Итак, когда счет меняется:

  1. обновить строку оценки и сохранить ее в поле;
  2. рассчитать позицию и сохранить ее в поле Vector2.

На drawScore рисовать только с данными с полей.

Также вы можете проверить GlyphLayout, чтобы лучше вычислить положение строки. Применяйте те же принципы, что и раньше, не используйте новые вычисления ни при жеребьевке, а делайте их при изменении счета.

person Aleris    schedule 14.10.2016