![](https://habrastorage.org/files/881/6df/59a/8816df59a76046fe9cc635e6502ab6ca.jpg)
Готовлю сейчас текстуры с буквами для нашей игрушки со словами. А у таких игр есть одна особенность: не переведешь игру на какой-то язык — не видать покупок от носителей этого языка. Поэтому релиз игры будет локализован на 42 языка. Это много-много разных букв, каждая из которых обрабатывается в фотошопе и вставляется в текстуру, место в которой — на вес золота. Приходится вникать в устройство современных алфавитов, чтобы брать только те буквы, которые действительно нужны в современных словах.
Погрузившись в этот процесс, я открыл для себя, на сколько фраза «расставить точки над и» не полна. Точки расставляют далеко не только сверху.
Количество вариантов написания латинских букв в Юникоде поистине велико. Каких только черточек, точек и загогулин рядом с буквами там нет. Это, в основном, диакритические знаки, показывающие, что эту букву надо читать как-то иначе. Как правило, со временем, количество диакритических знаков в языках уменьшается. Люди стараются упрощать алфавит. Неужели, после столетий упрощения алфавитов все еще остались необычные варианты? Да, и еще какие!
Давайте начнем с буквы i. Фраза «расставить точки над И» родилась в средние века, когда писцы переписывали тексты курсивом — без отрыва пера. При этом:
- Буква i без точки (просто короткая палочка) сливалась с другими буквами, поэтому ее стали выделять точкой сверху.
- Так как слово часто писали слитно, то все точки расставлялись после написания основной части слова.
Так и зародилась эта фраза-пословица, которая означает завершенность какого-то действия или отсутствие недоговоренного и т.д. Давайте посмотрим, как пишутся слова с буквой i без точек и эти же слова, но уже с точками над i. Действительно ли есть смысл в этих точках?
![](https://habrastorage.org/files/e99/a9b/90e/e99a9b90ed2c4cbb9ef59a417d910623.jpg)
Хотя писарям вряд ли доводилось писать именно эти слова, но точки явно помогают разглядеть коротенькие палочки. А бывают ли две точки над i? Да, во французском буква i используется до сих пор.
![](https://habrastorage.org/files/c82/124/8d8/c821248d818e49f1aada74915630f005.jpg)
В русском языке буква i употреблялась до реформы 1918 года. Более того, было время, когда ее писали с двумя точками! Получается, что в русском языке тоже расставляли точки над И. А вот еще один интересный момент: буква ы раньше состояла из двух букв: ъi. Поэтому можно сказать, что писцы расставляли точки и над буквой Ы!
Бывают такие языки, где приходится расставлять очень много точек. Среди языков, с которыми я имел дело, лидером по количеству точек сверху является финский. Вот смотрите:
![](https://habrastorage.org/files/f66/f08/d00/f66f08d00507482792eecaf2531b4012.jpg)
Три слова и 26 точек над буквами! Но точки ставят не только сверху. Например, в каталонском языке точка может быть поставлена между буквами одного слова.
![](https://habrastorage.org/files/c28/301/b85/c28301b855ed457fa6f12bbac0ba0888.jpg)
Сверху точку ставят, сбоку ставят, неужели не ставят снизу? Во вьетнамском ставят!
![](https://habrastorage.org/files/946/889/3b2/9468893b22a04ed8a55fdb3b4b2e23d4.jpg)
Вьетнамский язык, кстати, хорошо подходит в случае, если хочется порисовать у латинских букв много красивых закорючек. Ну не прекрасно ли?
![](https://habrastorage.org/files/1c4/687/a0b/1c4687a0b4ae4be69a0a58e954ad27be.jpg)
Кроме точек существует еще множество других модификация букв, например, перечеркивание. Возможно некоторые буквы сами по себе не нравятся носителям языка и это отторжение выражается в зачеркивании. Смотрите сами:
![](https://habrastorage.org/files/9f7/fa3/1ee/9f7fa31ee13b423fa68c5189d2f8174e.jpg)
Это конечно шутка, в каждом языке история появления перечеркнутых букв — своя.
В кириллице то же есть интересные модификации букв. Например, в казахском языке у некоторых согласных появляются ножки! Ножки есть и в русском алфавите у букв Д, Ц и Щ, но это как-то привычно, а вот несимметричная ножка у букв К и Н – непривычно.
![](https://habrastorage.org/files/a79/17a/091/a7917a091b6047f7a095b1904c667430.jpg)
Изучение алфавитов — на удивление увлекательное занятие. Как будто погружаешься в другие миры. Возможно в следующей жизни я бы вполне мог стать лингвистом, а пока мне надо «расставить все точки над Ы» — закончить подготовку текстуры 2048х2048 с буквами и доделать саму игру.
Комментарии (48)
hdfan2
03.10.2016 09:36А зачем вообще весь этот велосипед с сохранением глифов в текстуру? Есть какие-то платформы, которые не могут сами нормально отрендерить текст? Или у вас какой-то особый шрифт?
P.S. «Не ужели» -> «Неужели»DuhaTheBest
03.10.2016 09:43Дизайн игры требует оформления букв, которое не просто сделать программно, а вот в фотошопе — легко.
ultrinfaern
03.10.2016 10:17А вы не хотите прочитать про Unicode и как кодируются там символы. В нем есть как компактное представление так и спецпредставление, где символ разбивается на все закорючки.
DuhaTheBest
03.10.2016 10:19Да — это полезная вещь. Но стоит ли заморачиваться в данный момент — пока не решил. Возможно хватит и простого решения, что сэкономит время.
olexandr17
03.10.2016 10:19+4В украинском используется "і" и "ї".
В детстве помню, удивлялся, как можно написать слово «Україна» без буквы "ї" )Barafu
03.10.2016 11:33+1А в русском есть буквы «Е» и «Ё». Так вот, стандартные словари в браузерах, офисах и прочем просто заставляют менять Ё на Е везде, невзирая на правильное написание. Как в механических печатных машинках экономили на лишнем рычаге, так и пошло. Вот так вот и тупеют целые нации.
Правильные словари приходится по интернетам разыскивать и вручную ставить.faiwer
03.10.2016 12:09Так вот, стандартные словари в браузерах
Хм, это какие такие браузеры? Chrome этим часто раздражал, но те времена канули в лету. За другими браузерами такого не замечал.
Barafu
03.10.2016 13:06+3Вы правы, в Хроме поправили. В Лисе — нет. Если скачивать Лиса с официального сайта, а не с русского локализованного, то там русского словаря нет, но можно скачать «одной кнопкой». Как и для любого языка. Так вот, качает он словарь без Ё.
В Либреоффисе словарь без Ё. В Гугл-доках словарь без Ё. Словарная система в Убунту по-умолчанию качает словарь без Ё. Шёл 2016-й год.faiwer
03.10.2016 13:17+1Проверил в Firefox и в LibreOffice. Вы правы, грустно :-(
Если есть под рукой ссылки на bug-report-ы ? скиньте, я подключусь. А вот со словарной системой в Ubuntu (у меня LinuxMint Mate) вы меня озадачили. Что это и как оно работает? Google по такому запросу мне выдал разного рода StartDict-ы.Barafu
03.10.2016 13:38+1Я просто не помню, что именно там идёт по-умолчанию — то ли mspell, то ли hunspell. Нет под рукой Убунты, чтобы посмотреть. Большинство редакторов же сами словарями не заморачиваются, а смотрят, что из упомянутых установлено — и подключают.
Опять же, ладно бы они разницу Е/Ё просто пропускали, хочешь — еще пиши, а хочешь — ещё. Но они же «ещё» подчёркивают!
Ссылки скину как время будет.faiwer
03.10.2016 13:44+1Кстати говоря, подчёркивание Ё это ещё ерунда. А вот когда поиск полноценно срабатывает только для латиницы (как в sublime-text в linux до недавнего времени)… Тут совсем засада. К примеру вы ищете "яблоко", и редактор не находит "Яблоко", в то время как если бы вы искали "apple", то редактор нашёл бы "Apple". Или более распространённая в ПО проблема: срабатывание горячих клавиш только при eng-раскладке. В том же sublime-text приходится дублировать наиболее употребимые горячие клавиши в настройках.
Barafu
03.10.2016 13:56Стандарт Unicode так же содержит таблицы соответствия «аналогичных букв». То есть заглавных-обычных. Или как в каком-то языке последняя буква слова пишется по разному, если оно объект или субъект утверждения. Тут без ИИ вообще не проверишь.
Так что то, что вы описали — это автор алгоритма вместо поддержки юникода навелосипедил.
singeorange
04.10.2016 12:05В Office2013 проверяльщик не знает слова «её». У меня в настройках стоит принудительное использование «ё», так он «ее» подчёркивает, как ошибку, но при правом клике среди вариантов замены — «её» НЕТ!
singeorange
04.10.2016 12:04Тоже сразу вспомнил украинский, дочитав до «французских» двойных точек над i.
perfect_genius
03.10.2016 10:39В вашей игре так много текста?
Если немного, то нельзя ли было обойтись только пиктограммами?DuhaTheBest
03.10.2016 10:43Текста не много, а вот слов в первой версии будет 600, переведенных на 42 языка т.е. 25 200 разных слов.
perfect_genius
03.10.2016 11:37И их нельзя заменить пиктограммами?
DuhaTheBest
03.10.2016 11:41Не могу представить как.
perfect_genius
03.10.2016 19:30Я решил, что раз мало, то это слова в меню, но наверно имелся в виду сюжет.
mOlind
03.10.2016 12:59Для рендера текста из sdf нам тоже пришлось в свое время выбирать все глифы из шрифта, которые встречались в наших текстах. Пошли по следующему пути. Свой рендер текста разбирал юникод буквы на глифы (порой один глиф на несколько букв, как в случае с stra?e, где ? = ss). При генерации sdf текстур мы пробегались по всем текстам, из них собирали всю информацию о глифах и шрифтах из которых брались глифы (Для китайского например система рендера текста уходит искать глифы в китайские ширфты). И по этому набору шрифтов генерились SDF текстуры. Текстуры и бинарной информации из GPOS, GSUB таблиц шрифта хватает, чтобы из глифов собрать обратно буквы. Правильно выбрать расстояния между ними и их вертикальную позицию. Самые веселые буквы у тибетского языка, потому как у них отдельные юникод символы управляют количеством и порядком крышечек сверху и снизу.
DuhaTheBest
03.10.2016 13:10Классная система! Жаль, что скорее всего, в случае моей игры со словами, не получится ее применить. Там на буквы наложена текстура, обводки и прочие эффекты, чтобы в игре смотрелось красиво. Как оно состыкуется — большой вопрос.
Тибетский — очень красив!mOlind
03.10.2016 14:04Это отличный тест для своего рендера текста. Если тибетский рисуется хорошо — и другие с большой вероятностью будут работать нормально. :)
k12th
03.10.2016 13:24В английском тоже иногда употребляется буква i с двумя точками. Например, в слове naive.
Ну и не забываем про metal umlaut:)
a-motion
03.10.2016 14:19Это не буква «i» с двумя точками, а две точки — не умлаут. Это диакритический знак diaeresis, он же hiatus (русскую википедию по теме читать не сто?ит, там все плохо).
Его же можно встретить в названии шампанского «Moe?t», чтобы не было соблазна прочесть «oe» как дифтонг.
k12th
03.10.2016 14:21Это не буква «i» с двумя точками
А сколько там точек?
a-motion
03.10.2016 14:25Точек две :)
Но эти две точки не имеют вообще никакого отношения к букве, над которой нарисованы. «na?ive» тоже абсолютно легитимное написание этого слова.
Поэтому фраза «буква i с двумя точками» неверна («буквы „i?“» не существует, в отличие от, например, буквы «O» в датском и норвежском.
k12th
03.10.2016 15:42Сложный это вопрос. Один и тот же диакритический знак в разных языках служит разным целям и называется по-разному. Наличие в юникоде combining диакритики только запутывает. В общем и целом я бы сказал, что это вопрос разницы между глифом и буквой, но я лично не уверен, зачем эта разница нужна и не больше ли от нее вреда, чем пользы.
a-motion
03.10.2016 16:05Это несомненно вопрос запутанный. Но diaeresis в «nai?ve» — атрибут дифтонга, а не буквы. Нет такой сущности: «буква „i“ с двумя точками сверху» в английском. Конкретно диэрезис во всех языках служит одной цели: указать, что под ним (вокруг него) нет дифтонга (трифтонга). Упомянутая где-то тут каталанская точка между двойным «l» («instal·lacio») — это оно. И дефис в «co-operation». И диэрезис в старом написании «coo?peration».
И нет, это не всегда вопрос разницы между глифом и буквой: «A» в «Angstrom» — это буква, она и звучит не так, как «А» и вообще никаким боком не «А».
singeorange
04.10.2016 12:14naive — а это разве не калька с французского? Есть ведь версия и без точек.
k12th
04.10.2016 12:15Калька — это когда Бэггинса переводят как Сумкинса или Торбинса. А это заимствование.
a-motion
03.10.2016 14:22Фраза «расставить точки над И» родилась в средние века [...]
Оригинальная фраза гласит «расставить точки над i и перечеркнуть t».
в каталонском языке точка может быть поставлена между буквами одного слова
Не между абы какими буквами, а только между удвоенными «l», это классический diaeresis. В каталанском, как и в испанском, doble ele читается как «й» (см. Майорка), точка разделяет дифтонг и «instal·lacio» читается как ему и положено, через «л». В castellano (испанском) такого феномена нет, что забавно.
DuhaTheBest
03.10.2016 14:34На русском фраза звучит без t, а вот на английском уже с ней. Про каталанский — верное дополнение. Не стал эту подробность упоминать, хотя именно сейчас нахожусь в Андорре, среди носителей каталанского.
maaGames
Было бы интересно узнать ваше решение этой проблемы. Сохранили отдельно точку (и прочие закорючки) и уже при растеризации рисуете букву не одним глифом, а комбинацией из нескольких?
DuhaTheBest
Пока решение «в лоб» — сохраняю все варианты букв. Так гораздо проще парсить их в игре. Но заполненность текстуры сейчас уже 90%. Скорее всего придется, что-то придумывать…
maaGames
Я так понимаю, это какая-то онлайн игра, где пользователи могут друг с другом общаться? Иначе, можно для каждого языка хранить алфавиты в отдельных текстурах, даже удобнее будет. В принципе, даже если одновременно разные языки используются, нет проблем в хранении алфавитов в отдельных текстурах. Несколько лишних drawcall и переключений текстур принципиально не повлияют на производительность, а вот вам жизнь сильно упростят.
DuhaTheBest
Да, несколько вариантов текстур — вариант для «маргинальных» языков (которых не много). Проблема в том, что будет масса пересечений для европейских языков, которые имеют общую основу из одинаковых букв. Одним их возможных путей оптимизации является выделение основы в отдельную «большую» текстуру, и создание нескольких мелких текстур — локализаций. Вот, как раз думаю об этом.
maaGames
Если у вас уже есть поддержка отдельных текстур, зачем вообще беспокоиться о взаимопересечениях? Тем более, что начертание «одинаковых» букв сильно зависит от используемого шрифта. вот возьмёте в следующей версии другой набор шрифтов и начертание уже будет неправильным.
Но вот конкретно по вашей проблеме я в первом сообщении предложение выдвинул, что буквы «с особенностями» рисовать несколькими спрайтами. Но это предполагает чуть ли ни ручной препроцессинг и пользу от него вижу только в условиях критических ограничений на объём видеопамяти. Т.е. на современных PC даже заморачиваться с этим не стал бы.
DuhaTheBest
Целевая платформа игры — мобильная. Там имеет значение как общий объем дистрибутива (не хочется «раздувать» объем текстурами с дублированием букв), так и занимаемая оперативка (хочется поддерживать как-можно больше старых устройств).
maaGames
Для мобильных есть смысл, конечно.
А у вас движок не умеет рисовать TrueType прям из файла шрифта? Многие движки позволяют печатать шрифтом, без использования текстур. Может это медленнее, но всегда можно печатать текст в текстуру, а потом уже её много-много раз показывать игроку. Т.е. нужно один ttf файл хранить и всё.
DuhaTheBest
Движок умеет, но вот чтобы с эффектами — нет пока. Буквы в игре рисуются вдавленными в деревянные магнитики на холодильнике.
maaGames
У вас в текстуре они уже в виде магнитиков или просто «беленькие», а потом шейдер делает красиво? Если второе, то рисуете все буквы в текстуру, а потом уже эту текстуру шейдером в сцену.
А если первое, то «всё очень сложно».)))
DuhaTheBest
В текстуре — средний вариант: буквы с эффектом вдавливания, но без магнитиков :)
gleb_kudr
Я вдавленные буквы в iOS рисовал программно, в бытность, когда скевоморфизм считался модным. Сейчас уже не помню подробностей, но по сути там отрисовывается внутренняя тень в форме буквы/слова, а потом поверх нее накладывается чуть сдвинутая буква с текстурой "дна".
DuhaTheBest
Да, я уверен, что можно много эффектов фотошопа сделать программно. Вдавленность, засветка краев и т.д., вопрос времени/качества.
SBKarr
Как-то занимался похожей задачей. Идея сложилась такая, собирать из данных используемые символы и генерировать текстуру асинхронно с помощью PBO. Суть в том, что нам не нужны все символы алфавита сразу, нужны только те, что надо рисовать. Некий контроллер хранит список нужных глифов, он же удаляет/добавляет глифы при измнении того, что надо нарисовать. Причём удаление проводилось только по достижении предела размера текстуры, чтобы не заниматься лишними расчётами. При запросе удаления опрашивались все источники символов, после чего список заменялся и текстура создавалась в нуля.
В принципе, для девайсов с density 1.0 текстуры в 2048 на 2048 хватало. А у девайсов с density больше и максимальный размер текстуры больше.
Думаю, из-за требований по density предварительно созданной текстурой тут не обойтись, нужен таки алгоритм создания глифов на ходу в самой игре. Или хотя бы скрипты для каждого отдельного сложного символа.
DuhaTheBest
Интересная идея — спасибо! Единственно, в игре новые уровни-слова могут подкачиваться с сервера. Вот тут может возникнуть ситуация «нехватки» нужных букв. Подгрузку же текстур с сервера хочется избежать :)
Упаковку в текстуру отдал на откуп специализированному софту (Texture packer).