超过一定数量的字符后BitmapFont.draw性能问题

时间:2016-02-16 15:44:16

标签: libgdx

Libgdx:1.8 Windows 8.1 PRO

当超过一定数量的字符时,在这种情况下为51,cpu使用率从稳定的2-3%跃升至超过30%。 更改字体没有任何效果。

public class Main extends ApplicationAdapter {
    public GameAssetManager assetManager;
    public SpriteBatch batch;
    BitmapFont font;

    static final String text =
            ".........." + // 10 characters
            ".........." +
            ".........." +
            ".........." +
            ".........." +
            "."; // add "." and check task manager

    @Override
    public void create() {
        batch = new SpriteBatch();
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/Roboto-Medium.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
        parameter.characters = FreeTypeFontGenerator.DEFAULT_CHARS;
        parameter.size = 48;
        parameter.color = Color.WHITE;
        font = generator.generateFont(parameter);
        System.out.println("text length is " + text.length());
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        font.draw(batch, text, 0, Gdx.graphics.getHeight() - font.getAscent());
        batch.end();
    }
}

不幸的是,我没有一个能够准确指出问题的探查器。

编辑:

在这个问题上度过了一段美好的时光之后,我想出了无用的东西 最小的例子:

public class Main extends ApplicationAdapter {
    public SpriteBatch batch;
    BitmapFont font;
    BitmapFontCache fontCache;

    static final String text =
            ".........." + // 10 characters
            ".........." +
            ".........." +
            ".........." +
            ".........." +
            "..";

    @Override
    public void create() {
        batch = new SpriteBatch();
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/Roboto-Medium.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
        parameter.characters = FreeTypeFontGenerator.DEFAULT_CHARS;
        parameter.size = 48;
        parameter.color = Color.WHITE;
        font = generator.generateFont(parameter);

        fontCache = font.newFontCache();
        fontCache.addText(text, 100, 100);
        System.out.println("text length is " + text.length());
    }

    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        fontCache.draw(batch);
        batch.end();
    }
} 

正如我之前所说的,超过一些角色后的表现是可怕的。静态(在运行时不生成)位图字体的情况类似。 由于BitmapFontCache内部使用Label,因此此行为也适用于这些类。

欢迎任何见解。

0 个答案:

没有答案