Опубликовано

Game++. Устройство и оптимизация игрового движка

Game++. Устройство и оптимизация игрового движка

Книга рассказывает о тонкостях разработки игрового движка на языке 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

Добавить комментарий