我在游戏开始时使用gdx-freetype加载了truetype字体。加载时间太长,所以我想在另一个线程中加载字体。但是当它加载完毕后,字体无法正确呈现。喜欢这个
但是,当我关闭屏幕并再次打开时,它会正确显示:
我想知道当屏幕关闭再打开时切换此更改的内容,我应该如何修复它。
代码:
public class Game extends com.badlogic.gdx.Game {
SpriteBatch batch;
BitmapFont engFont;
AsyncResult<Void> loadResult;
static final int width = 800, height = 480;
@Override
public void create() {
batch = new SpriteBatch();
loadResult = new AsyncExecutor(10).submit(new LoadGameTask(this));
setScreen(new LogoScreen(this));
} // omitted
LoadGameTask类:
class LoadGameTask implements AsyncTask<Void> {
Game game;
LoadGameTask(Game game) {
this.game = game;
}
@Override
public Void call() throws Exception {
FreeTypeFontGenerator gen;
gen = new FreeTypeFontGenerator(Gdx.files.internal("data/square.ttf"));
game.engFont = gen.generateFont(100, Chars.chars, false);
gen.dispose();
game.engFont.setColor(1, 1, 1, 1);
game.engFont.getRegion().getTexture().setFilter(
Texture.TextureFilter.Linear, Texture.TextureFilter.Linear
);
return null;
}
LogoScreen类
public class LogoScreen implements Screen{
Game game;
OrthographicCamera camera;
public LogoScreen(Game game) {
this.game = game;
camera = new OrthographicCamera();
camera.setToOrtho(false, Game.width, Game.height);
}
@Override
public void render(float v) {
Gdx.gl.glClearColor(0.1f, 0.5f, 0.8f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
if(game.loadResult.isDone()) {
camera.update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
game.engFont.draw(
game.batch,
"Tenplus 한글",
Game.width / 2, Game.height / 2
);
game.batch.end();
}
}//omitted
答案 0 :(得分:2)
通常人们会在暂停后纹理消失,而不会出现问题。 :)
我认为在不同的线程上加载纹理是行不通的。通常,Libgdx不支持其他线程上的OpenGL操作。您可以执行打开字体文件的部分并在不同的线程上读取它,但我认为您需要确保在主线程上创建字体纹理的部分更加快乐。
我怀疑暂停后重新加载生成的字体的新代码(请参阅https://github.com/libgdx/libgdx/pull/896)是在暂停后为您修复字体。