
Книга рассказывает о тонкостях разработки игрового движка на языке C++. На материале компьютерных игр AAA-класса подробно разобран полный спектр работы со сложными программами на C++, способы оптимизации кода, структуры данных и их выбор для достижения максимальной производительности. Особое внимание уделено стандартной библиотеке шаблонов (STL) языка C++, многопоточной обработке, а также решению непредвиденных проблем, связанных с неопределённым поведением, поддержкой и обновлением сложнейших баз кода, а также поддержке работоспособности высоконагруженных систем.
Для программистов С++
Книга представляет собой сборник размышлений о языке программирования C++, алгоритмах и практиках в контексте разработки игр — о его сильных и слабых сторонах, практических решениях и устоявшихся способах работы. C++ на сегодняшний день остается основным языком в индустрии разработки игр благодаря сочетанию высокой производительности, гибкости и широкихвозможностей низкоуровневого контроля.
Несмотря на свою популярность, он обладает множеством архитектурных и синтаксических проблем, которые сложно устранить из-за необходимости поддерживать обратную совместимость и учитывать текущее направление развития языка.
Автор не претендует на универсальные ответы. В некоторых случаях он предлагает конкретные идеи и даже возможные решения, но чаще всего фокусируется на выявлении проблем производительности и обсуждении общих принципов проектирования современных игр и игровых движков. Во многих местах книги предложены решения, которые расходятся с общепринятыми подходами для разработки программного обеспечения.
По сути, это не академическое исследование и не руководство к действию — это личный перечень наблюдений, пожеланий и претензий к C++. В книге описаны подходы к разработке игр, выработанные автором на основе собственного опыта. Это бесценный материал, помогающий понять, как заставить сложные высоконагруженные системы работать предсказуемо, безотказно и с приемлемой скоростью.
Ключевые темы:
- Архитектура игровых движков
- Работа с памятью в компьютерных играх AAA-класса и других приложениях с высокими требованиями к производительности
- Структуры данных языка С++
- Работа со стандартной библиотекой шаблонов C++ (STL)
- Обработка исключений
- Неопределённое поведение и способы его предотвращения
- Память и аллокаторы
- Оптимизация в C++
- Многопоточность
- Классические паттерны проектирования применительно к разработке игр

Сергей Кушниренко — разработчик с более чем двадцатилетним опытом программирования и создания игр. Выпускник Национального исследовательского университета ИТМО. Начинал карьеру с разработки программного обеспечения для военно-морских тренажеров, навигационных систем и сетевых решений. Последние пятнадцать лет специализируется на разработке игр: в Electronic Arts занимался оптимизацией игр The Sims и SimCity BuildIt, в Gaijin Entertainment руководил переносом игр на платформы Nintendo Switch и Apple TV. Активно участвует в проектах с открытым исходным кодом, включая библиотеку ImSpinner и проект восстановления игры Pharaoh (1999).
Книгу “Game++. Устройство и оптимизация игрового движка” можно купить в нашем интенет-магазине.
Благодарности……………………………………………………………………………………….. 11
Disclaimer……………………………………………………………………………………………….. 13
От автора……………………………………………………………………………………………….. 15
Отзыв…………………………………………………………………………………………………….. 17
Кому стоит прочитать эту книгу?…………………………………………………………… 19
Часть I. Основы……………………………………………………………………………….. 21
0x10. С++, движки и архитектуры………………………………………………………….. 23
Почему С++?………………………………………………………………………………………………………………………………. 23
Что такое игровой движок?……………………………………………………………………………………………………….. 24
Первый главный вопрос — зачем?…………………………………………………………………………………………… 25
Второй главный вопрос — а надо ли?…………………………………………………………………………………….. 28
Либы + cmake != движок……………………………………………………………………………………………………………. 28
Полезности…………………………………………………………………………………………………………………………………. 30
Программирование……………………………………………………………………………………………………………………. 31
Главное окно (Main window)…………………………………………………………………………………………………….. 31
Игровой цикл………………………………………………………………………………………………………………………………. 32
Пользовательский ввод……………………………………………………………………………………………………………… 32
Графика………………………………………………………………………………………………………………………………………. 34
Ресурсы……………………………………………………………………………………………………………………………………….. 35
Вывод звука………………………………………………………………………………………………………………………………… 37
Физика…………………………………………………………………………………………………………………………………………. 37
AI…………………………………………………………………………………………………………………………………………………. 38
…Behavior Trees (BT)………………………………………………………………………………………………………….. 39
…GOAP (Goal-Oriented Action Planning)…………………………………………………………………………….. 39
…FSM (Finite State Machine)………………………………………………………………………………………………. 39
…Utility AI……………………………………………………………………………………………………………………………. 40
…экзотика: HTN, ML, Neural Nets, RL……………………………………………………………………………….. 40
…pathfinding………………………………………………………………………………………………………………………… 41
…navmesh……………………………………………………………………………………………………………………………. 41
…AI — это не про “умных врагов”…………………………………………………………………………………….. 42
Скрипты и конфиги…………………………………………………………………………………………………………………….. 42
…это не про производительность и не про fps…………………………………………………………………. 43
…это про удобство и скорость разработки………………………………………………………………………. 43
…на удивление, это про безопасность……………………………………………………………………………… 43
…это про реконфигурабельность проекта в целом………………………………………………………….. 44
…это дверь для комьюнити………………………………………………………………………………………………… 44
…это — всем не угодишь……………………………………………………………………………………………………. 44
Сеть……………………………………………………………………………………………………………………………………………… 45
…синхронизация состояний………………………………………………………………………………………………. 45
…предсказание ввода и откат (rollback netcode)……………………………………………………………… 46
…интерполяция, экстраполяция, сглаживание………………………………………………………………… 46
…безопасный протокол общения………………………………………………………………………………………. 47
…шифрование (параноиками просто так не становятся)………………………………………………… 47
…репликация объектов………………………………………………………………………………………………………. 47
…логирование и отладка……………………………………………………………………………………………………. 48
…борьба с читерами…………………………………………………………………………………………………………… 48
UI…………………………………………………………………………………………………………………………………………………. 48
Tools…………………………………………………………………………………………………………………………………………….. 49
…конвертеры уровня………………………………………………………………………………………………………….. 50
…проверка ресурсов…………………………………………………………………………………………………………… 50
Архитектура……………………………………………………………………………………………………………………………….. 50
…нет архитектуры — тоже архитектура………………………………………………………………………….. 51
…godobject — тоже архитектура………………………………………………………………………………………. 51
…ECS — модно! Но…………………………………………………………………………………………………………….. 52
Игра-движок……………………………………………………………………………………………………………………………….. 52
0x11. Архитектуры игровых движков…………………………………………………….. 55
Unity (Unitary Architecture)………………………………………………………………………………………………………… 57
Big Ball of Mud……………………………………………………………………………………………………………………. 58
Unreal Engine (Layered Architecture)………………………………………………………………………………………….. 62
CryEngine (Microkernel Architecture)…………………………………………………………………………………………. 66
Dagor (Data-driven Architecture)………………………………………………………………………………………………… 70
X-Ray Engine (Monolith Architecture)………………………………………………………………………………………… 72
Godot (Modules/Services Architecture)……………………………………………………………………………………….. 76
Часть II. Оптимизации…………………………………………………………………. 79
0x20. Какие бывают оптимизации…………………………………………………………. 81
Оптимизации на уровне архитектуры (~50% прироста)………………………………………………………… 83
Оптимизации на уровне алгоритмов/структур (~30%)…………………………………………………………… 84
Оптимизации на уровне исходного кода (~10%)…………………………………………………………………….. 85
Игровые реплеи (~?%)……………………………………………………………………………………………………………….. 91
Изоляция компонентов (~5%)……………………………………………………………………………………………………. 91
Специфичные низкоуровневые оптимизации (<3%)……………………………………………………………….. 92
Все остальное (~10%)………………………………………………………………………………………………………………… 92
Тесты производительности (Benchmarks)……………………………………………………………………………….. 92
Измерения…………………………………………………………………………………………………………………………………… 94
Изменения и интуиция инженера……………………………………………………………………………………………… 95
“Горячие” функции и “бутылочные горлышки”………………………………………………………………………. 96
“Горячие” функции (Hotspots)…………………………………………………………………………………………… 97
“Бутылочное горлышко” (Bottlenecks)……………………………………………………………………………… 97
Заблуждения и мифы…………………………………………………………………………………………………………………. 99
Инструменты……………………………………………………………………………………………………………………………. 102
Теория и термины…………………………………………………………………………………………………………….. 103
История одной оптимизации…………………………………………………………………………………………………… 106
Упаковка булевых значений…………………………………………………………………………………………………… 111
Без упаковки……………………………………………………………………………………………………………………… 112
std::bitset……………………………………………………………………………………………………………………………. 114
сustom_bitset……………………………………………………………………………………………………………………… 114
Выводы……………………………………………………………………………………………………………………………………… 120
0x21. Оптимизации строк…………………………………………………………………….. 123
Пул строк (String interning)………………………………………………………………………………………………………. 123
Не совсем строки……………………………………………………………………………………………………………………… 126
Реализация xstring……………………………………………………………………………………………………………………. 129
Как использовать…………………………………………………………………………………………………………………….. 131
Влияние на архитектуру…………………………………………………………………………………………………………. 132
Идентификаторы (Identifiers)………………………………………………………………………………………………….. 133
Короткие строки (Short String Optimisation)…………………………………………………………………………… 135
Короткоживущие строки (Short Live String)…………………………………………………………………………… 137
Долгоживущие строки (Long Live String)……………………………………………………………………………….. 141
Арены строк……………………………………………………………………………………………………………………………… 142
0x22. Оптимизации массивов……………………………………………………………….. 145
Оптимизация массивов (Cooking vectors)………………………………………………………………………………. 145
Недостатки векторов……………………………………………………………………………………………………………….. 150
Фиксированный массив (Fixed array)……………………………………………………………………………………… 155
Размерность стека……………………………………………………………………………………………………………………. 159
Статический вектор (Static vector)………………………………………………………………………………………….. 160
Гибридный вектор (Hybrid vector)………………………………………………………………………………………….. 164
“Холодные” и “горячие” данные (Hot/Cold data layout)……………………………………………………….. 166
0x23. Оптимизации аллокаторов………………………………………………………….. 169
Такие разные аллокаторы (Dancing with allocators)……………………………………………………………… 169
Управление памятью (Memory management)……………………………………………………………………….. 170
Ручное управление памятью (Manual memory management)……………………………………………… 172
Подсчет ссылок (RC, References counting)…………………………………………………………………………….. 173
Автоматический подсчет ссылок (ARC)………………………………………………………………………………… 174
Уникальное владение (Unique ownership)………………………………………………………………………………. 177
Фрагментация (Fragmentation)……………………………………………………………………………………………….. 178
Внутренняя фрагментация (Internal fragmentation)………………………………………………………. 178
Внешняя фрагментация (External fragmentation)…………………………………………………………… 179
Блок, заголовок, время жизни (block, header, lifetime)…………………………………………………………… 180
Получение ресурса есть инициализация (RAII, Resource Acquisition Is Initialization)………. 181
Утечка памяти (Memory leak)…………………………………………………………………………………………………. 182
Повторное освобождение (Double free)………………………………………………………………………………….. 183
“Висячие” указатели (Dangling pointers)…………………………………………………………………………………. 184
Повреждения кучи (Heap corruption)……………………………………………………………………………………… 185
Оборонительное программирование (Defensive programming)……………………………………………. 186
Умные указатели (Smart pointers)…………………………………………………………………………………………… 187
Собственные менеджеры памяти (Custom allocators)…………………………………………………………… 187
Отложенное освобождение (Lazy destroy)…………………………………………………………………………….. 188
Выделенная область памяти (Мemory arena)……………………………………………………………………….. 189
Дескрипторы объектов (Object handle)………………………………………………………………………………….. 190
Зависимости (Dependencies)……………………………………………………………………………………………………. 191
Каскадная очистка (Cascade cleanup)……………………………………………………………………………………. 193
Гонки данных (Data race)………………………………………………………………………………………………………… 194
Память-безопасные алгоритмы (Memory-safe algorithms)…………………………………………………… 195
Внутренняя изменяемость (Interior mutability)………………………………………………………………………. 196
Регистры процессора (CPU registers)………………………………………………………………………………………. 197
Отображение памяти (Memory mapping)………………………………………………………………………………. 198
Динамическая оперативная память (DRAM, Dynamic Random Access Memory)………………. 199
Прямой доступ к памяти (DMA, Direct memory access)………………………………………………………… 199
Выравнивание (Alignment)………………………………………………………………………………………………………. 200
Жизненный цикл инструкций………………………………………………………………………………………………….. 201
Предвыборка данных (Prefetching)…………………………………………………………………………………………. 203
Стек и куча (Stack vs Heap)…………………………………………………………………………………………………….. 204
Линейный аллокатор (Linear allocator)………………………………………………………………………………….. 205
Линейный аллокатор с откатом (Step-back allocator)…………………………………………………………… 208
Фреймовый аллокатор (Frame allocator)……………………………………………………………………………….. 210
Двойной фреймовый аллокатор (Double-frame allocator)…………………………………………………….. 212
Пример несогласованного поведения…………………………………………………………………………….. 215
N-фреймовый аллокатор (N-Frame allocator)………………………………………………………………………… 217
Стековый аллокатор (Stack allocator)……………………………………………………………………………………. 218
Двойной стековый аллокатор (Double-stack allocator)…………………………………………………………. 223
Двойной стековый аллокатор с общим началом (Pointed Double-Stack Allocator)……………. 227
Тройной стековый аллокатор (Triple-stack allocator)……………………………………………………………. 229
Пул памяти (Pool allocator)……………………………………………………………………………………………………… 233
Аллокатор со списком свободных блоков (Free list allocator)………………………………………………. 238
Аллокатор со свободными блоками под разные размеры (Segregated free lists)………………… 243
Парадокс скорости vs фрагментации…………………………………………………………………………………….. 246
Аллокатор готовых объектов (Slab-allocator)……………………………………………………………………….. 246
Аллокатор методом близнецов (Buddy allocator)…………………………………………………………………. 248
Арена объектов (Region-Based allocator)……………………………………………………………………………….. 251
Аллокатор с локальным кэшем для потока (Thread-cache allocator)………………………………….. 257
Фибоначчи аллокатор (Fibonacci allocator)…………………………………………………………………………… 261
Сжимающий аллокатор (Compacting allocator)……………………………………………………………………. 264
Двухуровневый аллокатор с разделением по размерам (Two-Level Segregated Fit)………….. 267
“Цветной” аллокатор (Color-based allocator)…………………………………………………………………………. 271
Аллокатор с отслеживанием времени жизни
(TTL Allocator, Time-to-live, Tracked- time-live)……………………………………………………………………… 273
Аллокатор с агрессивной рандомизацией адресов (Chaos allocator)…………………………………. 273
Аллокаторы != “серебряная пуля”………………………………………………………………………………………….. 275
0x24. Оптимизации контейнеров………………………………………………………….. 277
Контейнеры………………………………………………………………………………………………………………………………. 277
Инвалидация итераторов………………………………………………………………………………………………………… 278
Фиксированный массив (Fixed array)……………………………………………………………………………………… 279
Матрица (Matrix)……………………………………………………………………………………………………………………… 281
Неравномерная матрица (Ragged matrix, jagged arrays)………………………………………………………. 282
Динамическая матрица (Dynamic matrix)……………………………………………………………………………… 285
Динамический массив (Dynamic array, vector)………………………………………………………………………. 286
Стабильный вектор (Stable vector)…………………………………………………………………………………………. 288
Разреженный массив (Sparse array/vector)…………………………………………………………………………….. 292
Парадокс “ленивой сортировки”…………………………………………………………………………………….. 294
Упакованный вектор (Packed vector)……………………………………………………………………………………… 294
Гибридный вектор (Small/Hybrid vector)……………………………………………………………………………….. 296
Парадокс малых размеров………………………………………………………………………………………………. 300
Массив с отложенным удалением (Dirty vector)……………………………………………………………………. 300
Массив с чередованием (Buddy array)…………………………………………………………………………………… 304
Двусторонняя очередь (Deque, Double Ended Queue)…………………………………………………………… 306
Двусторонняя очередь со сжатием (Block-compressed deque)…………………………………………….. 308
Двусторонняя очередь с приоритетами (Bounded priority deque)……………………………………….. 310
Интрузивная двусторонняя очередь/список (Intrusive deque/list)………………………………………… 313
Пополняемый массив (Expandable vector)…………………………………………………………………………….. 316
Структурированное дерево данных (LSM, Level structured merge)…………………………………….. 318
Октодерево (Octree)………………………………………………………………………………………………………………….. 320
Квадродерево (Quadtree/btree)……………………………………………………………………………………………….. 325
Кольцевой буфер (Circular buffer)…………………………………………………………………………………………… 326
Хеш-таблица с мемоизацией (Memoization hashtable)…………………………………………………………. 330
Массив дескрипторов (Handle array)……………………………………………………………………………………… 333
Текстурный атлас (Texture atlas)……………………………………………………………………………………………. 337
Слотовый массив (Slot array)………………………………………………………………………………………………….. 341
0x25. Нескучное программирование…………………………………………………….. 345
Что такое нескучное программирование (Heapless programming)………………………………………. 345
Стек (Stack)………………………………………………………………………………………………………………………………. 353
Динамическая память (Heap)………………………………………………………………………………………………….. 359
Статическая память (Static)…………………………………………………………………………………………………….. 365
Компромиссы динамических объектов………………………………………………………………………………….. 367
Детерминизм стека…………………………………………………………………………………………………………………… 369
Утечки и оптимизации…………………………………………………………………………………………………………….. 370
Не использовать new?……………………………………………………………………………………………………………… 371
Локальные строки……………………………………………………………………………………………………………………. 373
Локальный полиморфизм (Ad-hoc polymorphism)………………………………………………………………… 375
std::get_if…………………………………………………………………………………………………………………………… 376
std::visit……………………………………………………………………………………………………………………………… 377
std::variant::index……………………………………………………………………………………………………………… 378
Оптимизируем векторы……………………………………………………………………………………………………………. 379
Оптимизация тайловой карты………………………………………………………………………………………………… 386
Работа с размеченной памятью (Preallocations)……………………………………………………………………. 388
“Тяжелые” логи………………………………………………………………………………………………………………………… 392
Часть III. Библиотека C++…………………………………………………………… 397
0x30. STL и алгоритмы…………………………………………………………………………. 399
Нестандартные стандарты…………………………………………………………………………………………………….. 399
Использование SIMD………………………………………………………………………………………………………………. 402
Алгоритмы………………………………………………………………………………………………………………………………… 404
Ортогональность данных и алгоритмов………………………………………………………………………………… 407
Итераторы………………………………………………………………………………………………………………………………… 409
Кэширование шейдеров (практический пример)………………………………………………………………….. 413
Как сделать через алгоритмы?……………………………………………………………………………………….. 415
Часто используемые алгоритмы…………………………………………………………………………………………….. 415
all_of………………………………………………………………………………………………………………………………….. 416
all_of (вредные советы)……………………………………………………………………………………………………. 417
any_of………………………………………………………………………………………………………………………………… 418
any_of (вредные советы)………………………………………………………………………………………………….. 419
find, find_if, find_if_not……………………………………………………………………………………………………. 420
find (вредные советы)………………………………………………………………………………………………………. 420
adjacent_find…………………………………………………………………………………………………………………….. 422
adjacent_find (вредные советы)………………………………………………………………………………………. 423
move, move_backward……………………………………………………………………………………………………….. 424
move (вредные советы)…………………………………………………………………………………………………….. 425
copy, copy_n, copy_if, copy_backward…………………………………………………………………………….. 425
count, count_if…………………………………………………………………………………………………………………… 426
count (вредные советы)……………………………………………………………………………………………………. 426
mismatch…………………………………………………………………………………………………………………………….. 427
mismatch (вредные советы)………………………………………………………………………………………………. 428
equal………………………………………………………………………………………………………………………………….. 429
equal (вредные советы)……………………………………………………………………………………………………. 429
is_permutation…………………………………………………………………………………………………………………… 431
is_permutation (вредные советы)…………………………………………………………………………………….. 431
search, search_n………………………………………………………………………………………………………………… 433
search (вредные советы)…………………………………………………………………………………………………… 433
replace, replace_if, replace_copy, replace_copy_if…………………………………………………………. 434
replace (вредные советы)…………………………………………………………………………………………………. 435
transform……………………………………………………………………………………………………………………………. 436
transform (вредные советы)……………………………………………………………………………………………… 437
remove, remove_if, remove_copy, remove_copy_if……………………………………………………………. 438
remove (вредные советы)………………………………………………………………………………………………….. 439
unique, unique_copy…………………………………………………………………………………………………………. 439
unique (вредные советы)………………………………………………………………………………………………….. 440
fill, fill_n……………………………………………………………………………………………………………………………. 441
fill (вредные советы)………………………………………………………………………………………………………… 441
generate, generate_n…………………………………………………………………………………………………………. 442
generate (вредные советы)……………………………………………………………………………………………….. 443
sort, partial_sort………………………………………………………………………………………………………………… 443
partial_sort (вредные советы)………………………………………………………………………………………….. 445
nth_element……………………………………………………………………………………………………………………….. 446
nth_element (вредные советы)…………………………………………………………………………………………. 446
reverse, reverse_copy…………………………………………………………………………………………………………. 447
merge………………………………………………………………………………………………………………………………….. 448
merge (вредные советы)……………………………………………………………………………………………………. 449
Часть IV. Многопоточность…………………………………………………….. 451
0x40. Мультипоточное программирование…………………………………………… 453
Конкурентность (Concurrency)……………………………………………………………………………………………….. 453
Масштабируемость (Scalability)…………………………………………………………………………………………….. 454
Cоперничество за ресурс (Contention)…………………………………………………………………………………… 455
Изолированное состояние (Separate state)…………………………………………………………………………….. 456
Общее состояние (Shared state)………………………………………………………………………………………………. 457
Копия состояния (Shadow state)……………………………………………………………………………………………… 458
Работа с потоками…………………………………………………………………………………………………………………… 459
Аналогия с реальным миром…………………………………………………………………………………………… 460
Проблемы потоков…………………………………………………………………………………………………………… 461
История одного бага, или многопоточный AI, который всех победил……………………………….. 465
Неблокирующая логика………………………………………………………………………………………………….. 465
Как было до С++11?………………………………………………………………………………………………………………… 467
Неблокирующие алгоритмы (non-blocking, lock-free, wait-free)…………………………………………… 471
Зачем куда-то уходить от мьютексов?…………………………………………………………………………………… 473
Атомарные операции………………………………………………………………………………………………………………. 475
Спинлок…………………………………………………………………………………………………………………………………….. 476
“Голодание” потоков (Thread starvation)……………………………………………………………………………….. 477
Алгоритмическое “голодание”………………………………………………………………………………………… 478
Эффекты кэша…………………………………………………………………………………………………………………… 479
Хороший спинлок для игры…………………………………………………………………………………………………….. 495
Практические советы………………………………………………………………………………………………………………. 498
Задачи (Tasks)………………………………………………………………………………………………………………………….. 500
Подвисания, подтормаживания (Hitching, Stutters)……………………………………………………………….. 502
Обращение к системе ресурсов (I/O hitching)………………………………………………………………… 502
Неправильная работа с потоками (Thread hitching)……………………………………………………… 503
Сборка мусора (GC hitching)…………………………………………………………………………………………… 504
Проблемы железа (Graphics hitching/stutters)…………………………………………………………………. 504
Рабочие потоки (Workers)……………………………………………………………………………………………………….. 505
Схема “один поток на ядро”……………………………………………………………………………………………. 505
Схема “два потока на ядро”……………………………………………………………………………………………. 507
Модель независимых задач (Embarrassingly Parallel Model)………………………………………………… 508
Модель с выборкой данных (Stateless workers)……………………………………………………………………… 511
Цепочки задач (Workers chain)……………………………………………………………………………………………….. 512
Часть V. Паттерны………………………………………………………………………… 521
0x50. Паттерны разработки………………………………………………………………….. 523
Фреймворки умирают, математика не стареет……………………………………………………………………… 523
Cиняя книга………………………………………………………………………………………………………………………………. 525
Синдром фломастера………………………………………………………………………………………………………………. 527
Уровни паттернов……………………………………………………………………………………………………………………. 528
Команда (Command)……………………………………………………………………………………………………………….. 530
Недостатки……………………………………………………………………………………………………………………….. 533
Возможности для расширения………………………………………………………………………………………… 533
Совместимость…………………………………………………………………………………………………………………. 534
Плохие примеры внедрения…………………………………………………………………………………………….. 534
Состояние (State)……………………………………………………………………………………………………………………… 536
Конечный автомат (Finite State Machine)………………………………………………………………………………. 537
Детерминированный конечный автомат (Deterministic [basic] FSM)…………………………… 539
Недетерминированный конечный автомат (Nondeterministic FSM)…………………………….. 540
Автомат состояний со стеком (FSM + pushdown states)………………………………………………… 541
Конечный автомат на основе состояний (State-based/Object-model FSM)…………………. 542
Возможности для расширения………………………………………………………………………………………… 544
Влияние на архитектуру…………………………………………………………………………………………………. 545
Недостатки……………………………………………………………………………………………………………………….. 546
Плохие примеры использования…………………………………………………………………………………….. 547
Разделяемый объект / Приспособленец (Flyweight)………………………………………………………………. 549
Влияние на архитектуру…………………………………………………………………………………………………. 551
Недостатки……………………………………………………………………………………………………………………….. 552
Совместимость…………………………………………………………………………………………………………………. 553
Плохие примеры использования…………………………………………………………………………………….. 553
Наблюдатель (Observer)………………………………………………………………………………………………………….. 555
Возможности для расширения………………………………………………………………………………………… 559
Влияние на архитектуру…………………………………………………………………………………………………. 560
Недостатки……………………………………………………………………………………………………………………….. 560
Совместимость…………………………………………………………………………………………………………………. 561
Примеры плохого использования…………………………………………………………………………………… 562
Шина событий (Event bus)………………………………………………………………………………………………………. 564
Возможности для расширения………………………………………………………………………………………… 566
Влияние на архитектуру…………………………………………………………………………………………………. 567
Недостатки……………………………………………………………………………………………………………………….. 568
0x51. “Ленивая” логика……………………………………………………………………….. 569
Флаг изменения (Dirty flag)……………………………………………………………………………………………………… 569
Влияние на архитектуру…………………………………………………………………………………………………. 572
Недостатки……………………………………………………………………………………………………………………….. 572
Совместимость…………………………………………………………………………………………………………………. 573
Примеры плохого использования…………………………………………………………………………………… 574
Слой логики (Update layer)……………………………………………………………………………………………………… 576
Ближний слой (Close Layer)…………………………………………………………………………………………….. 576
Средний слой (Mid Layer)……………………………………………………………………………………………….. 577
Дальний слой (Far Layer)…………………………………………………………………………………………………. 577
“Замороженные” объекты (Frozen Layer)……………………………………………………………………….. 578
Реализация………………………………………………………………………………………………………………………… 579
Влияние на архитектуру…………………………………………………………………………………………………. 580
Недостатки……………………………………………………………………………………………………………………….. 580
Совместимость…………………………………………………………………………………………………………………. 581
Примеры плохого использования…………………………………………………………………………………… 581
Что дальше?……………………………………………………………………………………………………………………………… 583
0xFF. Игры — это искусство………………………………………………………………… 585
Предметный указатель…………………………………………………………………………. 587
Об авторе……………………………………………………………………………………………… 591
