我在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);
文本将打印到屏幕上
但是过了一会儿,或者当我按下Home按钮然后回到应用程序时,所有字符都变为黑色矩形
关于最新情况的任何想法?
答案 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。