一段时间后,android libgdx位图字体转为黑色矩形

时间:2013-11-21 10:47:19

标签: android libgdx bitmap-fonts

我在android中使用 gdx-freetype 库从TrueType字体生成 BitmapFont ,该字体位于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);

文本将打印到屏幕上

enter image description here

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

enter image description here

关于最新情况的任何想法?

2 个答案:

答案 0 :(得分:4)

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

如果将libgdx升级到latest nightlies,则问题可能会消失。

有关更多信息,this article中非常好地描述了非托管纹理的问题。

答案 1 :(得分: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);
    }
}

我更喜欢我的只读资源是静态的,以便对内存友好。但是,静态资源的使用可能仍然会产生我不知道的问题,如per the manual