Егор Урванов

Архитектура игры «Эхо Разлома»: C4 и критические пути

Схемы C4 до уровня компонентов и четыре критических пути через sequence: запуск, кадр, касание скалы и подстройка качества.

Игра «Эхо Разлома» — открытый остров 900 × 900 м в браузере: без движка и сборки, одна страница и набор модулей. Здесь описано, как она устроена: схемы C4 до уровня компонентов и четыре пути, на которых всё держится.

C4: контекст и контейнеры

Уровень 1. Система и её окружение

Игрокклавиатура, мышь«Эхо Разлома»игра в браузереCDN jsDelivrthree.js, Rapierиграетгрузит библиотеки
Всё необходимое для игры приходит из браузера и CDN. Своего сервера у игры нет: подойдёт любой статический хостинг.

Уровень 2. Контейнеры

Страницаopen-world.htmlцикл, сюжет, сборка мираМодулиmodules/*.jsмир, тело, качествоФизикаphysics.js + RapierWorldFillпроцедурное оформлениеПакеты ассетовpack, veg, bakedCDNthree.js, Rapierinit и update по порядкушагbuildзагрузкацели, лучиWASM
Страница владеет циклом и сюжетом, остальное подключается к ней. Модуль, который падает, отключается один.

C4 уровня 3: компоненты контекстов

Контексты общаются через общий объект ctx и несколько глобальных объектов. У каждого факта один хозяин: пилота двигает физика, кости пишет сборщик позы, о предметах мира знает реестр.

Мир

Рельеф и снегterrain.jsКонтакт со снегомgroundblend.jsАтмосферанебо, сияние, туманРастительностьдеревья, траваПостройкиstructures.jsWorldFillгоры, лёд, мелочьРеестр Passport(контекст «Физика»)высота, снегпосадка на снегстволыстеныформы
Всё, что твёрдое, регистрируется в Passport и становится столкновением.
  • Деревья рисуются пакетами по материалам: один вызов отрисовки на материал.
  • Дальние деревья заменены картинками с восьми сторон.

Тело и контакт

Реестр COREчто это за объектМозг скалрешает действиеОбщее движениеноги, наклон, взглядОщущениязвук, следыСборщик позыпишет костиПружинытолчки, падениеЗамер телаBODYCONTACTвид объектаруки, наклонноги, взглядпружинызамер, поправкикасание
Четыре модуля просят, один пишет: сборщик позы — единственный, кто двигает кости.
  • Мозг скал читает форму камня и выбирает одно из действий: ладонь, спина, плечо, уступ, сесть, залезть.
  • Замер тела измеряет настоящую нарисованную форму, его же использует судья в тестах.

Физика

Реестр Passportобъекты и ролиКоллайдерыоболочка и точная формаКонтроллер пилотакапсула, эллипс у скалМир RapierWASMЗапросылучи, касты, цельроль, формапо расстояниюшагответы
Физика — единственная, кто двигает пилота; остальные дают ей цель через setGoal.
  • Рядом с пилотом камень получает точную форму, вдали остаётся упрощённая оболочка.
  • У скал капсула пилота превращается в эллипс по размерам тела.

Сюжет и интерфейс

Главы и зоныSTAGES, ZONESДиалогивыбор ответовБойкристаллы, големИнтерфейсHUD, карта, журналСохраненияlocalStorageсценызоныпрогресс
Этот контекст пока живёт внутри страницы и не вынесен в модули.
  • Пять глав и два финала, 24 осколка и 8 записей-эхо.
  • Прогресс хранится в браузере, без сервера.

Качество

Выбор пресетаLowEnd.pickПресетыair … ultraРегулятормасштаб рендера по кадруКэш тенейлуна не движетсяДетализациядеревья, камниБюджет текстурtexbudgetпри стартена ходурадиусдальностьлимиты
Пресет задаёт всё сразу: сначала подбирается по видеокарте, потом подстраивается по времени кадра.
  • Луна не движется, поэтому тени от неподвижных предметов считаются один раз и лежат в кэше.
  • В меню, на паузе и в скрытой вкладке цикл полностью останавливается.

Ассеты

ЗагрузчикloadPackedПакетыGLB в base64Текстурыassets/vegДальние деревьякартинки с 8 сторонЗапечённый светbaked.jsМодули мираберут готовоеразбор
Модели лежат в .js-файлах как текст: так игра грузится с любого статического хостинга.
  • Загрузчик показывает список модулей и ресурсов, пока всё не готово.
  • Тяжёлое готовится заранее вне игры: картинки дальних деревьев и запечённый свет.

Четыре критических пути

1. Запуск игры

ИгрокСтраницаCDNЗагрузчикФизикаМодулиоткрываетthree.js, Rapierбиблиотекипакеты, текстурыготовождёт PhysReadyмир созданinit по возрастанию orderмир собранменю, новая игра
Игра не стартует, пока не готовы библиотеки, физика и модули.

2. Один кадр

ЦиклФизикаМодулиМирРендерИнтерфейсшаг пилотаположениеupdate(dt)убывание order: тело, затем мирснег, деревья, небокадрHUD
Модули идут по убыванию order: сначала тело (55 … 40), последними мир (−10).

3. Пилот у скалы

ВводФизикаДвижениеМозг скалСборщикРендеридти к скалеположениеноги, наклон, взглядчитает форму, выбираетцель: встать здесьруки на точкизамер, поправкикости
Решает мозг скал, двигает физика, кости пишет сборщик.

4. Подстройка качества

СтраницаВыбор пресетаРегуляторМирРендервидеокарта?пресетдальность, тенивремя кадрамасштаб рендерадальность деревьев
Сначала грубый выбор по видеокарте, потом мелкая подстройка по каждому кадру.

Правила, на которых всё держится

  • Физика единственная двигает пилота. Остальные дают цель.
  • Сборщик позы единственный пишет кости. Остальные присылают запросы.
  • Реестр Passport единственный знает о предметах мира. Столкновения строятся из него.
  • Модуль падает один. Ошибка отключает только его.
  • Один замер «внутри камня». Игра и проверки меряют одинаково.

Слабые места

Где Что не так
Страница-монолит Сюжет, цикл и реестр Passport лежат в одном файле на 4,5 тысячи строк, границ между ними нет.
Порядок модулей Порядок задан числами в коде; ошибка в числе меняет поведение молча.
Глобальные объекты Модули обмениваются через window.*: связи не видны в коде.
Поза пилота Итоговую позу решают несколько модулей; единого владельца ещё нет.
Вес загрузки Пакеты в base64 и библиотеки с внешнего CDN.

Об игре

Страница игрыЭхо РазломаПотерпевший крушение пилот, полярный остров и светящийся разлом во льду — 3D-игра с сюжетом в браузере
© 2026 Егор Урванов