2

我在 android 中使用gdx-freetype库从 assets/fonts/arial.ttf 中的 TrueType 字体生成BitmapFont这是我用来在屏幕上显示一些文本的方式

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);

文本将很好地打印到屏幕上

在此处输入图像描述

但是过了一会儿或者当我按下主页按钮然后回到应用程序时,所有字符都变成黑色矩形

在此处输入图像描述

知道发生了什么吗?

4

2 回答 2

4

问题是 FreeTypeFontGenerator 创建的纹理直到最近的提交才被管理。纹理是非托管的这一事实意味着它们必须在丢失 OpenGL 上下文后重新加载,这发生在您描述的场景中。

如果您将 libgdx 升级到最新的 nightlies,那么问题可能会消失。

有关更多信息,本文很好地描述了非托管纹理的问题。

于 2013-11-21T13:46:09.453 回答
1

万一有人仍然有这个问题。使用 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);
    }
}

我更喜欢我的只读资产是静态的,以便记忆友好。但是,根据手册,使用静态资源可能仍会产生我不知道的问题。

于 2016-08-13T18:27:36.930 回答