растровые шрифты android libgdx через некоторое время превращаются в черные прямоугольники

Я использую библиотеку gdx-freetype в Android для создания BitmapFont из шрифта TrueType, который находится в assets/fonts/arial.ttf. Я использую этот способ для отображения некоторого текста. на экране

generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/arial.ttf"));
font30 = generator.generateFont(60 , "ConectigTsrv" , false);
generator.dispose();    
Label l = new Label("Connecting to server...", new LabelStyle(font30 , Color.BLUE));
l.setX(400 - l.getWidth()/2f);
l.setY(480 - l.getHeight() - 10);
stage.addActor(l);

текст будет напечатан на экране очень хорошо

введите здесь описание изображения

Но через некоторое время или когда я нажимаю кнопку «Домой», а затем возвращаюсь в приложение, все символы превращаются в черные прямоугольники.

введите здесь описание изображения

Любая идея о том, что происходит?


person doorbash    schedule 21.11.2013    source источник
comment
Я бы сделал отладку, чтобы точно увидеть, что происходит, когда вы нажимаете любую из кнопок.   -  person Pontus Backlund    schedule 21.11.2013
comment
Я полагаю, это вина растрового изображения   -  person Shuhrat Akramov    schedule 21.11.2013


Ответы (2)


Проблема в том, что текстуры, созданные FreeTypeFontGenerator, не управлялись до этого недавнего фиксации. Тот факт, что текстуры неуправляемы, означает, что их необходимо перезагружать после потери контекста OpenGL, что происходит в сценариях, подобных описанному вами.

Если вы обновите libgdx до последних ночных игр, проблема, вероятно, исчезнет.

Для получения дополнительной информации проблема с неуправляемыми текстурами очень хорошо описана в этой статье.

person Rod Hyde    schedule 21.11.2013
comment
yesssss Я использовал последнюю ночную сборку, и все в порядке. Я только что прочитал статью, о которой вы упомянули, спасибо. Но версия, которую я использовал, была 0.9.9. Commit выполняется после этой версии, не так ли? - person doorbash; 21.11.2013

В случае, если у кого-то все еще есть эта проблема. Используя LibGDX 1.9.2, у меня также возникла эта проблема: запустите игру, перейдите «назад» на домашний экран Android, вернитесь в игру, и шрифты будут черными прямоугольниками.

Оказалось, что я загружал все текстуры статически, то есть загружал их только один раз при запуске игры и больше никогда:

//THIS IS WRONG
public class Styles {
    public static final BitmapFont HEADER_FONT;
    public static final FreeTypeFontGenerator _freeTypeFontGenerator = ...

    static {
        FreeTypeFontGenerator.FreeTypeFontParameter params = ...
        HEADER_FONT = freeTypeFontGenerator.generateFont(params);
    }
}

Это вызывает проблемы, когда игра перезагружается в память. Насколько я понимаю, финальные поля теперь относятся к несуществующим данным текстуры. Чтобы исправить это, я избавился от окончательных свойств и загрузил их в функцию create(), пересоздавая все ресурсы каждый раз, когда игра перезагружается в память:

public void onCreate() {
    Styles.loadAssets();
}

И в стилях:

//STATIC RESOURCES CAN CAUSE TROUBLE, KEEP IT IN MIND
public class Styles {
    public static BitmapFont HEADER_FONT;
    public static FreeTypeFontGenerator FONT_GENERATOR = ...

    public static void loadAssets() {
        FreeTypeFontGenerator.FreeTypeFontParameter params = ...
        HEADER_FONT = FONT_GENERATOR.generateFont(params);
    }
}

Я предпочитаю, чтобы мои активы только для чтения были статическими, чтобы быть удобными для памяти. Однако использование статических ресурсов может по-прежнему создавать проблемы, о которых я не знаю, как в соответствии с руководством.

person Jos van Egmond    schedule 13.08.2016