|
12 | 12 | - Растровые шрифты BMFont
|
13 | 13 | - Артефакты и рекомендации
|
14 | 14 | - Кэш шрифта
|
| 15 | +- Генерация во время выполнения |
| 16 | +- Предварительная генерация кэша глифов |
| 17 | +- Скриптование шрифтов |
15 | 18 | ---
|
16 | 19 |
|
17 | 20 | # Ресурс Font
|
|
22 | 25 | - OpenType
|
23 | 26 | - BMFont
|
24 | 27 |
|
25 |
| - |
26 | 28 | Шрифты, добавленные в проект, автоматически конвертируются в текстуру, которую Defold может визуализировать. Доступны два метода визуализации шрифтов, каждый из которых имеет свои преимущества и недостатки:
|
27 | 29 |
|
28 | 30 | - Bitmap
|
29 | 31 | - Distance field
|
30 | 32 |
|
31 |
| -<div class='sidenote' markdown='1'> |
32 |
| -Вместо генерации и включения текстуры шрифта в состав приложения можно [генерировать глифы шрифта во время выполнения](/extension-fontgen) из встроенного шрифта TrueType. Такой подход может значительно сократить размер загрузки и потребление оперативной памяти в игре на Defold. |
33 |
| -</div> |
34 |
| - |
35 | 33 | ## Создание шрифта
|
36 | 34 |
|
37 | 35 | Чтобы создать шрифт для использования в Defold, создайте новый файл Font, выбрав в меню <kbd>File ▸ New...</kbd>, затем <kbd>Font</kbd>. Можно также <kbd>кликнуть ПКМ</kbd> в нужном расположении в браузере ассетов и выбрать <kbd>New... ▸ Font</kbd>.
|
@@ -177,4 +175,79 @@ space ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E
|
177 | 175 |
|
178 | 176 | `float horizontal_gradient = fract(var_texcoord0.y / texture_size_recip.w);`
|
179 | 177 |
|
180 |
| -Подробнее об унифицированных шейдерных переменных см. В [руководстве по шейдерам](/ru/manuals/shader). |
| 178 | +Подробнее об унифицированных шейдерных переменных см. В [руководстве по шейдерам](/ru/manuals/shader). |
| 179 | + |
| 180 | +## Генерация во время выполнения |
| 181 | + |
| 182 | +Возможно использовать генерацию шрифтов типа SDF (Distance Field) во время выполнения при использовании шрифтов TrueType (.ttf). |
| 183 | +Этот подход позволяет значительно уменьшить размер загрузки и потребление памяти во время выполнения в игре на Defold. |
| 184 | +Небольшой недостаток — небольшая задержка при генерации каждого глифа во время выполнения. |
| 185 | + |
| 186 | +Активируйте эту возможность, установив параметр `font.runtime_generation` в файле game.project. |
| 187 | + |
| 188 | +<div class='sidenote' markdown='1'> |
| 189 | +Эта функция на данный момент является экспериментальной, но планируется использовать её в качестве основного рабочего процесса в будущем. |
| 190 | +</div> |
| 191 | + |
| 192 | +<div class='important' markdown='1'> |
| 193 | +Этот параметр влияет на все .ttf шрифты в проекте. |
| 194 | +</div> |
| 195 | + |
| 196 | +### Предварительная генерация кэша глифов |
| 197 | + |
| 198 | +Чтобы упростить использование шрифтов, генерируемых во время выполнения, поддерживается предварительная генерация кэша глифов. |
| 199 | +Это означает, что шрифт сгенерирует глифы, указанные в поле *Characters* ресурса шрифта. |
| 200 | + |
| 201 | +<div class='sidenote' markdown='1'> |
| 202 | +Если установлено свойство `All Chars`, предварительная генерация не будет выполняться, так как это противоречит цели — не генерировать все глифы сразу. |
| 203 | +</div> |
| 204 | + |
| 205 | +### Скриптование шрифтов |
| 206 | + |
| 207 | +Для шрифтов, генерируемых во время выполнения, можно добавлять и удалять подшрифты. |
| 208 | +Это полезно, если один большой шрифт был разделён на несколько файлов по наборам символов (например, для CJK). |
| 209 | + |
| 210 | +<div class='important' markdown='1'> |
| 211 | +Добавление подшрифта не приводит к автоматической загрузке или отображению всех глифов. |
| 212 | +</div> |
| 213 | + |
| 214 | +```lua |
| 215 | +-- Добавить диапазон A-Z в .fontc |
| 216 | +local font_hash = hash("/assets/fonts/roboto.fontc") |
| 217 | +local ttf_hash = hash("/assets/fonts/Roboto/Roboto-Bold.ttf") |
| 218 | +local codepoint_min = 0x00000041 -- A |
| 219 | +local codepoint_max = 0x0000005A -- Z |
| 220 | +font.add_source(font_hash, ttf_hash, codepoint_min, codepoint_max) |
| 221 | +``` |
| 222 | + |
| 223 | +```lua |
| 224 | +-- Удалить связанный ttf-ресурс |
| 225 | +local font_hash = hash("/assets/fonts/roboto.fontc") |
| 226 | +local ttf_hash = hash("/assets/fonts/Roboto/Roboto-Bold.ttf") |
| 227 | +font.remove_source(font_hash, ttf_hash) |
| 228 | +``` |
| 229 | + |
| 230 | +Чтобы загрузить глифы в шрифт, необходимо вызвать `font.add_glyphs()`. |
| 231 | +Это асинхронная операция, и после её завершения можно безопасно отображать сообщения, содержащие эти глифы. |
| 232 | + |
| 233 | +```lua |
| 234 | +local function add_glyph_callback(self, id, result, errmsg) |
| 235 | + if not result then |
| 236 | + print("Запрос " .. id .. " завершился с ошибкой:", errmsg) |
| 237 | + else |
| 238 | + msg.post(some_url, "show_dialog") |
| 239 | + end |
| 240 | +end |
| 241 | + |
| 242 | +-- Загрузить глифы в шрифт |
| 243 | +local font_hash = hash("/assets/fonts/roboto.fontc") |
| 244 | +local glyphs = "Some text to be shown!" -- для наилучшей производительности используйте список уникальных глифов |
| 245 | +local request_id = font.add_glyphs(font_hash, ttf_hash, add_glyph_callback) |
| 246 | +``` |
| 247 | + |
| 248 | +И, когда символы больше не нужны, можно освободить память: |
| 249 | +```lua |
| 250 | +-- Удалить глифы из памяти |
| 251 | +local font_hash = hash("/assets/fonts/roboto.fontc") |
| 252 | +font.remove_glyphs(font_hash, "Все символы из набора") |
| 253 | +``` |
0 commit comments