17 августа 2016

Растровые шрифты Лампоголового :)


Почитал я Антона Карлова и решил тоже чего-нибудь черкануть про растровые шрифты... ну как бы это тренд, видимо, не?
Начну с того, что шрифты имеют дико клевую историю... сначала они были набором пикселей (растр), потом их решили делать векторными (ибо мониторы стали разные, и текст стал масштабируемым), а теперь разработчики под мобильные платформы вынуждены красивые векторные шрифты снова превращать в набор пикселей. Досада...
Как это делаю я - сегодня! И только здесь! :)

Техническая справка

Если коротко - то я люблю вектор. Он прям весь такой по фен-шую, может отображаться на любом мониторе и девайсе, занимает мало места на диске и редактируется в большом количестве адекватных программ. Почему бы всё в векторе не отображать? Ну, с приходом мобильных девайсов стало понятно, что на их маленьких и медленных процессорах не получится выжать хорошую производительность при отрисовке вектора каждый кадр. А всё растущая скорость интернета показала, что размер вектора уже не решает - ибо нет разницы закачать 3-4 Мб за полсекунды, или 12-20 Мб за две секунды. Раз так - можно спокойно использовать растр везде, где хочется. Ибо фотошоп более распространен ;)


Ну может и тебе перейти на растр?

Да, надо бы... Но пайплайн с вектором у меня уже отработан - мне понятно "что? куда? где?". А с растром как-то всё менее прозрачно. Нужно несколько атласов под разные разрешения, всё это занимает лишнее место на диске, да и как формировать эти атласы? Например, у меня есть покадровая анимация. Кадров, эдак, 15. Получается, чтобы их начать использовать в игре мне сначала надо выгрузить сиквенцию png-шек, добавить их в пакер атласов эффектов, собрать несколько атласов под каждое разрешение и только тогда я смогу нормально собрать их в игре обратно в анимацию, используя имя файлов (имя? вы серьёзно? как-то ни разу фен-шуем не пахнет). Замечу, что "как там в юнити" я не знаю, поправьте, если там всё в один клик и два танца с бубенцом.


Ясно, Лампоголовый - лузер, и как же с этим быть?

Здесь всё просто. При старте игры я каждый раз пакую вектор в растровые атласы и потом уже эти атласы использую для отображения графики. Пайплайн при этом простой: нарисовал анимацию, и в коде указал "это анимация id, заталкивать ее в атлас номер пять". Всё, теперь в любой момент я могу создать анимацию по ее id. При старте приложения оно само узнает масштабный коэффициент, создаст атлас нужного размера, увеличит/уменьшит векторную графику и затолкает в указанный атлас. Минус - растеризация происходит при каждом запуске приложения. Такие дела.


Ок, ясно, сплошное извращение. А что там со шрифтами?

И вот мы подошли к теме этого сообщения. Шрифты. Нормальные люди с ними обычно поступают так: либо используют готовый шрифт-генератор, который создает шрифт-атлас и следом к нему xml-файл с информацией по каждому символу из шрифта... либо, как Антон генерят картинку в фотошопе (или любом другом годном редакторе), а дальше парсят эту картинку в недо-шрифтгенераторе, который создает нужный xml-файл. Ну, это нормальные люди... А я? Маньяки вроде меня делают так: при старте приложения растеризуется нужный шрифт, загоняется в атлас и используется везде, где хочется. Теперь подробнее...


Ну расскажи, наконец, чего там у тебя происходит-то?!

Ну ок, уговорили :)... Выглядит это так:

fManager.CreateFont(
    ConstTexts.FONT_UI_MIDDLE,
    ConstBitmaps.ATLAS_STAGE,
    ConstBitmaps.FONT_DAMAGE_BASE,
   'Times New Roman', 'Font_Damage_Base',
   15,
   '-+1234567890;:., ' );

Ну и в самой игре уже так:

fCount = new GameTextField();
fCount.CreateByFontID( ConstTexts.FONT_UI_MIDDLE );
fCount.color = 0xD14C60;
addTextChild( fCount );

Занавес :)


Что это вообще было? Какой, к лешему, "занавес"?

Да-да, стоит пояснить чего-нибудь.
Итак, при старте я вызываю CreateFont(), куда указываю id-шрифта (просто число, по которому шрифт будет доступен потом), id-атласа, куда бы затолкать этот шрифт, id-текстуры, по которому я смогу найти картинку этого шрифта в случае чего, название шрифта, название шрифта в игре для не-Bitmap шрифтов, размер шрифта, и набор символов, который я собираюсь использовать.
А в игре уже создаю свой объект GameTextField, который внутри себя содержит TextField (и флеш, и старлинг-версию) и умеет по id-шрифта отображать его как надо.


Звучит бредово... но все же - где достать всё это барахло? Ссылку дай!

Не дам, я жадный :)
Мне лень чистить код, разбрасывать все по папкам, правильно называть, изучать как выложить в свободный доступ и вообще следовать фен-шую. Поэтому я просто рассказал идею, как у меня все работает. Возможно, когда-нибудь я и осилю этот нелегкий путь, чтобы показать свой криворукий код.


Зачем тебе вообще все это? Рассказывай нам плюсы и минусы, а то что-то непонятно.

Я не особо разбираюсь, но для меня это выглядит как-то так...
Минусы:
  • Растеризация при каждом запуске. Хоть и секундное дело, но все-таки
  • Пришлось покодить, и до сих пор еще и половины не готово... ну, для приятного использования.
  • Это флеш. Фу-у-у-у...
  • На текст не применить эффекты, выглядит стандартным, без тени или другой ерунды
Плюсы:
  • Я могу создать шрифт одной строчкой кода. Нужно изменить размер? Не проблема - поменял одно число, перекомпилил и вперед!
  • Не знаю, как там в про-движках. Но у меня шрифт автоматически запихивается в любой атлас. Количество DrawCall'ов ( обращений к видео-карте ) минимально. Даже для сотни текстовых надписей.
  • Перекомпиляция под флеш / мобильные происходит Сама собой. Поставил gpu = true, и у меня собрались атласы под Bitmap шрифты. Поставил false, и у меня чистый флеш.
Блин, как-то маловато плюсов нашлось. Ну да ладно. Надо бы слезать с флеша-то уже... Я и на Делфи когда-то давно слишком долго рассиживался. Консерватизм? Мэй би :)


И вот теперь...

Занавес.

Сообщения, схожие по тематике:

0 коммент.:

Отправить комментарий