Перед каждый разработчиком, если он пишет приложение графическое на своём движке, рано или поздно встаёт вопрос: каким образом вывести текст. Напомню, что OpenGL/ES умеет только рисовать треугольники и накладывать на них текстуру.
Существуют три основных подхода:
Готовые текстовые битмапы
Все надписи, которые встречаются в игре, рисуются заранее в текстуру. Такой вариант самый быстрый и простой в реализации для программиста. Фактически, вам надо взять текстуру и ее нарисовать (надеюсь вы это уже умеете).
Даёт полный простор для творчества, можно рисовать любую надпись, любым стилем и цветом.
Для оптимизации можно все надписи поместить в одну текстуру и рисовать все надписи на экране в один проход. При локализации необходимо рисовать другую текстуру с переведенным текстом.
Плюсы:
- Максимальная производительность
- Полная свобода дизайна (любые стили и эффекты)
- Всю работу делает художник/дизайнер
Минусы:
- Медленная локализация
- Большой расход памяти
- Нельзя динамически менять текст
Текстура с символами (текстурный атлас)
Для реализации этого способа необходимо заранее сгенерировать текстурный атлас с каждым символом из шрифта.
Самый медленный в реализации способ из предложенных, зато каждый символ может быть нарисован в любом стиле. Но помните, что для каждого языка придётся заново рисовать каждый символ в выбранном вами стиле.
Плюсы:
- Относительно высокая производительность
- Быстрая локализация (сгенерировать новую текстуру для языка)
- Шрифт в любом стиле
- Динамическое изменение надписи
Минусы:
- Необходимо написать генератор этих текстур
- Для разных языков нужны разные атласы
- Локализация увеличивает размер приложения
Динамическая генерация из файла шрифта
Фактически этот вариант представляет собой второй способ, но вместо текстуры с символами, используется файл шрифта (например ttf), где все эти символы описаны в векторном формате. В этом случае вместо мегабайтных текстур вам необходимо хранить один файл шрифта размером в десятки, максимум сотни, килобайт.
Текстуру можно создавать двумя способами: заполнить её всеми используемыми символами (26 — латинский алфавит, 33 — кириллица) или добавлять символ только тогда, когда он понадобится. Уже сложившейся традицией для генерации символа из шрифта является использование библиотеки FreeType.
Плюсы:
- Минимальный расход памяти (один файл шрифта)
- Простая локализация
- Полная динамичность текста
- Поддержка всех языков
Минусы:
- Требует больше CPU при первом использовании символов
- Ограниченный стиль (зависит от шрифта)
- Сложная реализация
Подробнее о работе с FreeType (+ практический пример) читайте в моём следующем посте: «Использование библиотеки FreeType для растеризации символов».