Pull to refresh

Comments 48

Было бы интересно узнать ваше решение этой проблемы. Сохранили отдельно точку (и прочие закорючки) и уже при растеризации рисуете букву не одним глифом, а комбинацией из нескольких?
Пока решение «в лоб» — сохраняю все варианты букв. Так гораздо проще парсить их в игре. Но заполненность текстуры сейчас уже 90%. Скорее всего придется, что-то придумывать…
Я так понимаю, это какая-то онлайн игра, где пользователи могут друг с другом общаться? Иначе, можно для каждого языка хранить алфавиты в отдельных текстурах, даже удобнее будет. В принципе, даже если одновременно разные языки используются, нет проблем в хранении алфавитов в отдельных текстурах. Несколько лишних drawcall и переключений текстур принципиально не повлияют на производительность, а вот вам жизнь сильно упростят.
Да, несколько вариантов текстур — вариант для «маргинальных» языков (которых не много). Проблема в том, что будет масса пересечений для европейских языков, которые имеют общую основу из одинаковых букв. Одним их возможных путей оптимизации является выделение основы в отдельную «большую» текстуру, и создание нескольких мелких текстур — локализаций. Вот, как раз думаю об этом.
Если у вас уже есть поддержка отдельных текстур, зачем вообще беспокоиться о взаимопересечениях? Тем более, что начертание «одинаковых» букв сильно зависит от используемого шрифта. вот возьмёте в следующей версии другой набор шрифтов и начертание уже будет неправильным.
Но вот конкретно по вашей проблеме я в первом сообщении предложение выдвинул, что буквы «с особенностями» рисовать несколькими спрайтами. Но это предполагает чуть ли ни ручной препроцессинг и пользу от него вижу только в условиях критических ограничений на объём видеопамяти. Т.е. на современных PC даже заморачиваться с этим не стал бы.
Целевая платформа игры — мобильная. Там имеет значение как общий объем дистрибутива (не хочется «раздувать» объем текстурами с дублированием букв), так и занимаемая оперативка (хочется поддерживать как-можно больше старых устройств).
Для мобильных есть смысл, конечно.
А у вас движок не умеет рисовать TrueType прям из файла шрифта? Многие движки позволяют печатать шрифтом, без использования текстур. Может это медленнее, но всегда можно печатать текст в текстуру, а потом уже её много-много раз показывать игроку. Т.е. нужно один ttf файл хранить и всё.
Движок умеет, но вот чтобы с эффектами — нет пока. Буквы в игре рисуются вдавленными в деревянные магнитики на холодильнике.
У вас в текстуре они уже в виде магнитиков или просто «беленькие», а потом шейдер делает красиво? Если второе, то рисуете все буквы в текстуру, а потом уже эту текстуру шейдером в сцену.
А если первое, то «всё очень сложно».)))
В текстуре — средний вариант: буквы с эффектом вдавливания, но без магнитиков :)

Я вдавленные буквы в iOS рисовал программно, в бытность, когда скевоморфизм считался модным. Сейчас уже не помню подробностей, но по сути там отрисовывается внутренняя тень в форме буквы/слова, а потом поверх нее накладывается чуть сдвинутая буква с текстурой "дна".

Да, я уверен, что можно много эффектов фотошопа сделать программно. Вдавленность, засветка краев и т.д., вопрос времени/качества.
Как-то занимался похожей задачей. Идея сложилась такая, собирать из данных используемые символы и генерировать текстуру асинхронно с помощью PBO. Суть в том, что нам не нужны все символы алфавита сразу, нужны только те, что надо рисовать. Некий контроллер хранит список нужных глифов, он же удаляет/добавляет глифы при измнении того, что надо нарисовать. Причём удаление проводилось только по достижении предела размера текстуры, чтобы не заниматься лишними расчётами. При запросе удаления опрашивались все источники символов, после чего список заменялся и текстура создавалась в нуля.
В принципе, для девайсов с density 1.0 текстуры в 2048 на 2048 хватало. А у девайсов с density больше и максимальный размер текстуры больше.

Думаю, из-за требований по density предварительно созданной текстурой тут не обойтись, нужен таки алгоритм создания глифов на ходу в самой игре. Или хотя бы скрипты для каждого отдельного сложного символа.
Интересная идея — спасибо! Единственно, в игре новые уровни-слова могут подкачиваться с сервера. Вот тут может возникнуть ситуация «нехватки» нужных букв. Подгрузку же текстур с сервера хочется избежать :)

Упаковку в текстуру отдал на откуп специализированному софту (Texture packer).
А зачем вообще весь этот велосипед с сохранением глифов в текстуру? Есть какие-то платформы, которые не могут сами нормально отрендерить текст? Или у вас какой-то особый шрифт?

P.S. «Не ужели» -> «Неужели»
Дизайн игры требует оформления букв, которое не просто сделать программно, а вот в фотошопе — легко.
А вы не хотите прочитать про Unicode и как кодируются там символы. В нем есть как компактное представление так и спецпредставление, где символ разбивается на все закорючки.
Да — это полезная вещь. Но стоит ли заморачиваться в данный момент — пока не решил. Возможно хватит и простого решения, что сэкономит время.
В украинском используется "і" и "ї".
В детстве помню, удивлялся, как можно написать слово «Україна» без буквы "ї" )
А в русском есть буквы «Е» и «Ё». Так вот, стандартные словари в браузерах, офисах и прочем просто заставляют менять Ё на Е везде, невзирая на правильное написание. Как в механических печатных машинках экономили на лишнем рычаге, так и пошло. Вот так вот и тупеют целые нации.
Правильные словари приходится по интернетам разыскивать и вручную ставить.
Так вот, стандартные словари в браузерах

Хм, это какие такие браузеры? Chrome этим часто раздражал, но те времена канули в лету. За другими браузерами такого не замечал.

Вы правы, в Хроме поправили. В Лисе — нет. Если скачивать Лиса с официального сайта, а не с русского локализованного, то там русского словаря нет, но можно скачать «одной кнопкой». Как и для любого языка. Так вот, качает он словарь без Ё.
В Либреоффисе словарь без Ё. В Гугл-доках словарь без Ё. Словарная система в Убунту по-умолчанию качает словарь без Ё. Шёл 2016-й год.

Проверил в Firefox и в LibreOffice. Вы правы, грустно :-(
Если есть под рукой ссылки на bug-report-ы ― скиньте, я подключусь. А вот со словарной системой в Ubuntu (у меня LinuxMint Mate) вы меня озадачили. Что это и как оно работает? Google по такому запросу мне выдал разного рода StartDict-ы.

Я просто не помню, что именно там идёт по-умолчанию — то ли mspell, то ли hunspell. Нет под рукой Убунты, чтобы посмотреть. Большинство редакторов же сами словарями не заморачиваются, а смотрят, что из упомянутых установлено — и подключают.
Опять же, ладно бы они разницу Е/Ё просто пропускали, хочешь — еще пиши, а хочешь — ещё. Но они же «ещё» подчёркивают!
Ссылки скину как время будет.

Кстати говоря, подчёркивание Ё это ещё ерунда. А вот когда поиск полноценно срабатывает только для латиницы (как в sublime-text в linux до недавнего времени)… Тут совсем засада. К примеру вы ищете "яблоко", и редактор не находит "Яблоко", в то время как если бы вы искали "apple", то редактор нашёл бы "Apple". Или более распространённая в ПО проблема: срабатывание горячих клавиш только при eng-раскладке. В том же sublime-text приходится дублировать наиболее употребимые горячие клавиши в настройках.

Стандарт Unicode так же содержит таблицы соответствия «аналогичных букв». То есть заглавных-обычных. Или как в каком-то языке последняя буква слова пишется по разному, если оно объект или субъект утверждения. Тут без ИИ вообще не проверишь.
Так что то, что вы описали — это автор алгоритма вместо поддержки юникода навелосипедил.
В Office2013 проверяльщик не знает слова «её». У меня в настройках стоит принудительное использование «ё», так он «ее» подчёркивает, как ошибку, но при правом клике среди вариантов замены — «её» НЕТ!
Тоже сразу вспомнил украинский, дочитав до «французских» двойных точек над i.
В вашей игре так много текста?
Если немного, то нельзя ли было обойтись только пиктограммами?
Текста не много, а вот слов в первой версии будет 600, переведенных на 42 языка т.е. 25 200 разных слов.
И их нельзя заменить пиктограммами?
Я решил, что раз мало, то это слова в меню, но наверно имелся в виду сюжет.
А ещё есть (в абхазском языке) буква п с ножкой — Ԥ, которую там чаще пишут как Ҧ но в русском языке она приобрела совершенно особое «звучание» (в варианте без засечек она смотрится не так весело, лучше смотреть это в таймсе).
Для рендера текста из sdf нам тоже пришлось в свое время выбирать все глифы из шрифта, которые встречались в наших текстах. Пошли по следующему пути. Свой рендер текста разбирал юникод буквы на глифы (порой один глиф на несколько букв, как в случае с straße, где ß = ss). При генерации sdf текстур мы пробегались по всем текстам, из них собирали всю информацию о глифах и шрифтах из которых брались глифы (Для китайского например система рендера текста уходит искать глифы в китайские ширфты). И по этому набору шрифтов генерились SDF текстуры. Текстуры и бинарной информации из GPOS, GSUB таблиц шрифта хватает, чтобы из глифов собрать обратно буквы. Правильно выбрать расстояния между ними и их вертикальную позицию. Самые веселые буквы у тибетского языка, потому как у них отдельные юникод символы управляют количеством и порядком крышечек сверху и снизу.
Классная система! Жаль, что скорее всего, в случае моей игры со словами, не получится ее применить. Там на буквы наложена текстура, обводки и прочие эффекты, чтобы в игре смотрелось красиво. Как оно состыкуется — большой вопрос.

Тибетский — очень красив!
Это отличный тест для своего рендера текста. Если тибетский рисуется хорошо — и другие с большой вероятностью будут работать нормально. :)

В английском тоже иногда употребляется буква ï с двумя точками. Например, в слове naïve.


Ну и не забываем про metal umlaut:)

Это не буква «i» с двумя точками, а две точки — не умлаут. Это диакритический знак diaeresis, он же hiatus (русскую википедию по теме читать не сто́ит, там все плохо).


Его же можно встретить в названии шампанского «Moët», чтобы не было соблазна прочесть «oe» как дифтонг.

Это не буква «i» с двумя точками

А сколько там точек?

Точек две :)


Но эти две точки не имеют вообще никакого отношения к букве, над которой нарисованы. «näive» тоже абсолютно легитимное написание этого слова.


Поэтому фраза «буква ï с двумя точками» неверна («буквы „ï“» не существует, в отличие от, например, буквы «Ø» в датском и норвежском.

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

Это несомненно вопрос запутанный. Но diaeresis в «naĩve» — атрибут дифтонга, а не буквы. Нет такой сущности: «буква „i“ с двумя точками сверху» в английском. Конкретно диэрезис во всех языках служит одной цели: указать, что под ним (вокруг него) нет дифтонга (трифтонга). Упомянутая где-то тут каталанская точка между двойным «l» («instal·lació») — это оно. И дефис в «co-operation». И диэрезис в старом написании «coöperation».


И нет, это не всегда вопрос разницы между глифом и буквой: «Å» в «Ångström» — это буква, она и звучит не так, как «А» и вообще никаким боком не «А».

naïve — а это разве не калька с французского? Есть ведь версия и без точек.

Калька — это когда Бэггинса переводят как Сумкинса или Торбинса. А это заимствование.

Фраза «расставить точки над И» родилась в средние века [...]

Оригинальная фраза гласит «расставить точки над i и перечеркнуть t».


в каталонском языке точка может быть поставлена между буквами одного слова

Не между абы какими буквами, а только между удвоенными «l», это классический diaeresis. В каталанском, как и в испанском, doble ele читается как «й» (см. Майорка), точка разделяет дифтонг и «instal·lació» читается как ему и положено, через «л». В castellano (испанском) такого феномена нет, что забавно.

На русском фраза звучит без t, а вот на английском уже с ней. Про каталанский — верное дополнение. Не стал эту подробность упоминать, хотя именно сейчас нахожусь в Андорре, среди носителей каталанского.
Sign up to leave a comment.

Articles