LibGDX — прекрасная библиотека. Её очень легко использовать, хотя в ней есть некоторые аспекты, которые не так просты и понятны. Шрифты — один из примеров. Я провёл много часов, прежде чем нашёл решение, при котором шрифты и на десктопе, и в мобильных телефонах выглядят пристойно. Я уже писал, что у меня получилось добиться результатов с Distance Field, но я ошибался. Заставить хорошо выглядеть удалось только TTF.

Забудьте о bitmap‑шрифтах. На попытки заставить их выглядеть пристойно на всех девайсах уйдёт уйма времени. Результат при этом будет более чем посредственным — даже несмотря на то, что это более или менее рекомендованный путь. Но всё‑таки, если у вас не сотни шрифтов, лучше использовать TrueType Fonts.

TTF дают великолепный результат. Но есть в их использовании один маленький трюк: нужно размер шрифта сделать независимым от размера экрана. Вот сниппет, который готовит, конвертирует и добавляет в скин TTF‑шрифт:

class MyGame() : Game() {
    var skin: Skin = Skin()

    override fun create() {
        val generator = FreeTypeFontGenerator(Gdx.files.internal("Roboto-Regular.ttf"))

        val param = FreeTypeFontGenerator.FreeTypeFontParameter()
        val ratio = Gdx.graphics.width / 960f

        param.size = (48 * ratio).toInt()
        val robotoFont = generator.generateFont(param)

        skin.addRegions(TextureAtlas(Gdx.files.internal("skin.atlas")))
        skin.add("normaltext", robotoFont)
        skin.load(Gdx.files.internal("skin.json"))
    }

    override fun dispose() {
        super.dispose()
        skin.dispose()
    }
}

Всё очень просто. Работает идеально. Никаких просадок производительности не замечено.