Как игры справляются с отображением азиатского юникод-текста?

8

В настоящее время я занимаюсь внедрением рендеринга текста в своем игровом движке, и я решил использовать BMfont AngelCode для генерации текстур шрифтов, а затем иметь OpenGL для рендеринга текстурированных квадов для каждого персонажа. Это прекрасно работало, даже при рендеринге каждого глифа, поддерживаемого FreeFont (в частности, FreeMono), пока я не попытался отрисовать японский (мой японский шрифт - Noto, предоставленный Google).

Рендеринг каждого отдельного символа, поддерживаемого FreeMono в 16px, привел к единственной 8-битной текстуре 1024x1024, что вполне разумно, учитывая, сколько языков покрыто ею. Рендеринг всего, что поддерживается Noto Japanese, в одном и том же размере привел к увеличению в 13 раз текстур, и при этом размере большинство глифов слишком тесны, чтобы их можно было прочитать (я не могу читать по-японски, но если бы я мог, я бы подумал, что еще много проблем с чтением этого текста).

Мой вопрос двоякий:

1) Как игры или мобильные приложения обрабатывают небольшой японский текст? Они придерживаются подмножества кандзи, используют специальный шрифт или минимальный размер шрифта?

2) Как игры обычно обрабатывают абсурдно огромное количество символов, необходимых для японского, китайского, корейского и других языков? Используют ли они FreeType (или что-то подобное) для визуализации текста на лету?

Примечание: я попробовал Meiryo (у меня нет лицензии на использование в моей игре), и результат был намного более читабельным при 16px (хотя все еще ограниченным), но все еще требовалось 14 текстур, чтобы соответствовать всему.

Гайдн В. Харач
источник

Ответы:

6

Я использую библиотеку freetype ( http://www.freetype.org/ ) для загрузки глифов из шрифтов freetype, а затем использую bin упаковку для генерации текстуры / атласа глифа во время выполнения, подобно тому, как это делает freetype-gl ( https : //code.google.com/p/freetype-gl/ ).

Когда игра инициализируется, я создаю глиф-атлас с печатными символами из диапазона ASCII. Этот атлас не изменится во время игры. Дополнительный атлас используется не для символов ascii.

Всякий раз, когда строка ставится в очередь для рисования, я проверяю, есть ли глиф, который еще не был загружен. Если такой глиф встречается, я отмечаю атлас глифа как грязный и регенерирую атлас глифа перед рендерингом. Если атлас заполнен, глифы, не относящиеся к ascii, удаляются, если они не использовались в течение определенного количества времени / кадров.

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

Опять же, я не рисую много вещей, кроме текста еще ...

Exilyth
источник
5

В играх, над которыми я работал, мы ограничивали подмножество символов, используемых для китайского, японского и корейского языков (вместе именуемых CJK), только теми, которые необходимы для отображения текста в игре.

Другими словами, мы не пытались втиснуть всех возможных персонажей; мы просто взяли базу данных CJK-текста у наших команд по локализации, обошли ее, чтобы найти все кодовые точки Unicode, которые встречались хотя бы один раз в тексте, и сгенерировали файл конфигурации BMFont для размещения атласа именно для этих символов. (Все это было автоматизировано, поэтому каждый раз, когда мы получали новую локализацию, мы могли при необходимости обновлять список символов и шрифтов.)

Как вы можете себе представить, это значительно уменьшает количество необходимых символов. Мы также сжимали растровые изображения шрифтов с помощью DXT1, который довольно хорошо работает для текста (даже с сглаживанием). BMFont также имеет возможность использовать все четыре цветовых канала изображения в качестве отдельных страниц (таким образом, получая в 4 раза больше символов на странице), но это не так уж хорошо работает со сжатием, поэтому мы не стали его использовать.

Я не уверен насчет размеров шрифта. Если у вас нет друзей, читающих CJK, которые могли бы взглянуть и сказать, слишком ли он мал, вы можете попробовать посмотреть фильмы с субтитрами на CJK, чтобы понять, какой объем текста.

Натан Рид
источник
Спасибо за вклад. Что произойдет, если пользователю будет разрешено вводить текст? Например, введите имя игрока или окно чата для онлайн-игры.
Гайдн В. Харач
@ HaydnV.Harach Да, ввод текста - это проблема. Для чата это может сработать, чтобы ограничить число 1000 наиболее распространенных китайских иероглифов или что-то в этом роде; вам нужно будет спросить кого-то, кто знает больше об этих языках, чтобы убедиться, что это будет жизнеспособным. Что касается имени игрока, вы можете один раз отобразить его с помощью FreeType и кэшировать растровое изображение для использования в качестве дополнительного «символа» в вашем рендерере.
Натан Рид