[architecture] Обновление Horizon до Nightly: удалён WASM, перенос Renderer и поэтапная миграция; сначала backports памяти/pacing #130

Open
opened 2026-11-06 11:46:56 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Вывод

Обновление имеет смысл, но прямой переход на текущий upstream несовместим с AirDef. Это отдельная миграция архитектуры мода и перенесённого рендерера. Краткосрочно есть полезные небольшие backports, не требующие этого перехода.

Проверка 6 ноября 2026 по исходникам, release API, истории Git и git merge-tree. Ничего не мержилось и не публиковалось в кодовых ветках.

Закреплённые версии

Компонент Проверенный SHA / база
AirDef main 1a693763fdf98916a39b394bb512340cc84bac87; HORIZON_COMMIT=b6c936f82b08798057161bdfa577e3aac53fb91e, v0.2.93
AirDef kimi-work при проверке 0b645d77e9497f1598ef6808e477c7e26aa87bd5
Текущий gitlink/форк движка 278f356aa604fa21c2d15d0081823bbe0f891df2; база a3acb5f0d2f59d2d5ff21a5aa000809ba1e35e2f, v0.2.97, 60 собственных commit objects поверх общего предка
Последний опубликованный Nightly, полученный из release API 66f3981f522b24c250b21523a70080965b940424, Nightly 2026-11-05; immutable source tag nightly-source/2026-11-05-66f3981
Отдельно просмотренный снимок upstream main a1ff75a4a525b6a9e1ed68f74cf9d54161596370; не приравнивается к опубликованному Nightly

В upstream release-flow с 28 октября движок выпускается только как Nightly. v0.2.97 помечен устаревшим; новые launcher@0.2.xx — отдельные выпуски лаунчера. Ждать нового «stable v0.2.98» вместо решения о миграции — не действующий план обновления.

#72 касается предыдущего шага .93→.97, уже выполненного в kimi-work. Эту issue не следует трактовать как повтор #72 или автоматически закрывать #72 за владельца.

Подтверждённый блокер: WASM больше не исполняется

0c9a49390 удаляет WASM runtime, SDK, WIT и sandbox test harness. Предшествующее изменение убирает выполнение WASM code mods из игры. В новой документации .hmod — только content/data/assets; исполняемый код — native .hnmod, меняющий исходники перед сборкой игры. cargo horizon-mod build отказывает папке с Cargo.toml, sandbox test удалён. Остаточный wasmparser у registry не означает сохранённого runtime.

AirDef всё ещё зависит по path от horizon-mod-sdk и пакует исполняемый WASM. Поэтому замена gitlink/бинарника на upstream не просто «может» нарушить совместимость: исчезает сам путь сборки/загрузки нынешнего кода мода. Сохранение расширения .hmod у content mods это не исправляет.

Реальная сложность объединения

Проба без изменения рабочего дерева:

git merge-tree --write-tree   278f356aa604fa21c2d15d0081823bbe0f891df2   66f3981f522b24c250b21523a70080965b940424

Exit=1, 76 конфликтующих путей/сообщений: 18 content conflicts, 18 modify/delete, 40 file-location из-за переездов. Последние 40 не равны 40 независимым сложным алгоритмическим конфликтам, но требуют корректного размещения и wiring.

Upstream выделил horizon-client-render; наши HD gfx/hd/*, smoke, scene post, изменённые terrain/entity shaders должны быть перенесены туда и согласованы с новым Renderer. Есть конфликты в game.rs, mods.rs, remote.rs, WIT/runtime/SDK, упаковщике, LAN, lib и shaders. Между базой .97 и Nightly меняется 3131 путь; +1,011,007/−91,030 строк включают generated/docs и не являются оценкой числа переписанных вручную строк. История включает 13787 commit objects / 3701 first-parent commits; это не число уникальных исправлений.

Чистое разрешение Git-конфликтов не докажет сохранность функциональности. Особенно уязвимы live/history world queries (#105), замена серверных чанков, акустика/invalidation/worker bookkeeping, съёмочные камеры и MP4 cleanup, HD post, model normals, autosave и часы replay/export.

Что полезно забрать уже сейчас

  1. Рост staging-памяти при увеличении геометрии: f7b77fbc8. Старый StagingBelt держит отдельные oversized buffers под постепенно увеличивающиеся записи. Upstream округляет oversized staging allocation до степени двойки, копируя только фактическую длину. В текущем форке gfx/upload.rs ещё старый; общий entity batch в gfx.rs загружается через него каждый кадр. Это релевантно большим динамическим моделям AirDef. Патч проходит git apply --check на текущем форке после замены только пути client-render→client. Это подтверждает текстовую переносимость; собственный runtime/GPU замер удержанных буферов здесь не выполнялся. Перенести также upstream-тесты роста и readback, проверить память на налёте и после его окончания.
  2. Windows/Vulkan, лишняя синхронизация при VSync off: da4ded1d7, gfx-rs/wgpu#10714. Fence остаётся для FIFO, где он нужен для pacing, и не сериализует кадры без VSync. В текущем форке исправления нет. Полный патч проходит git apply --check без поправок, включая notices. Кандидат для ПК 5600X/3060 только если используется Windows+Vulkan и VSync off; не объясняет автоматически все просадки и не исправляет Metal/DX12. Проверить FIFO/Immediate/Mailbox, DXGI-путь и GPU capture на Windows.
  3. Микрофризы дальнего рельефа: cb6a80698 — бюджет применения результатов вместо полного drain за кадр; далее warming reductions на worker. Архивированный upstream A/B полезен как основание для исследования, но не является измерением AirDef. Для backport проверить зависимости LOD и сохранность query/streaming. Не брать один early-return без всего контракта backlog.
  4. Освобождение arena pages вне render thread: #6687, далее освобождение разреженных страниц; потенциально полезно для p99 кадров и памяти. GPU culling e62b4a1ea относится к штатным entity paths; автоматически не ускоряет все самодельные set-models инстансы мода. Нужен профиль конкретного пути, не обещание «все ракеты теперь отсекаются GPU».
  5. Upstream развивает HDR/float frame и совместимость shader packs. Разделять наличие в Nightly и main: Shader API 0.2 #9930, commit bd186dc7321cadc471c18b5ff232718a435a9ccc, есть в просмотренном main, но не является предком Nightly 66f3981. PR сохраняет 0.1 и вводит экспериментальный контракт linear light; сам по себе ещё не означает полный linear HDR pipeline. Это важная точка согласования с #124/#125, но не готовые DLSS/MetalFX/RT.

Варианты дальнейшего пути

Вариант Что получаем Цена и ограничение
Временно сохранить текущую базу и брать выбранные исправления Быстрее проверить память/pacing, не ломая весь мод Долг расхождения растёт; нужна дата/условие возврата к миграции
Перенести адаптер AirDef на native, сохранив airdef-core Соответствие новому upstream, прямой host access и меньше WASM marshaling Порт UI/render/audio/world/storage и специального функционала форка; новый build/install; native выполняется с правами игры, без прежней WASM-песочницы
Сохранить WASM как свой compatibility layer поверх нового upstream Меньше изменений в публичном API самого AirDef Поддерживать свой runtime/SDK/WIT/упаковщик/тесты, встраивать lifecycle в новый Game/Renderer; upstream больше это не поддерживает. Не равно копированию назад одного crate

Предварительная рекомендация: сначала два небольших backport выше с замерами. Параллельно не запускать гигантский merge «исправлять пока соберётся»: сначала короткий native-прототип и инвентаризация возможностей, затем решение native adapter vs собственный WASM layer. Долгосрочно native лучше совпадает с направлением upstream и уже выделенным core, но полнота host API для наших камер, post-processing, звука и world-history должна быть доказана прототипом. Не переписывать боевое ядро лишь из-за смены runtime.

План и приёмка миграции

  1. Зафиксировать source SHA опубликованного Nightly; отдельная migration-ветка, старый проверенный gitlink сохраняется. Не зависеть от двигающегося nightly/main без SHA.
  2. Составить матрицу: tick/command/input, HUD/карта, модели/частицы/свет/post, звук и acoustics, world live/history/queries, storage/save, replay/camera/export. Для каждой строки — существующий upstream native API, нужное расширение и проверка.
  3. Вертикальный прототип: native adapter вызывает тот же core; один комплекс и цель, реальный voxel trace, изображение и звук, сохранение и короткий replay/export. Убедиться, что thread/lifecycle ownership корректен на server-thread и in-frame путях.
  4. Переносить HD/акустические/world-history изменения тематическими коммитами; после каждого этапа сохранять результаты проверок. Generated API/hooks не править слепым выбором ours/theirs.
  5. Native core/scenario tests остаются. WASM contract/budget tests либо сохраняются для compatibility layer, либо заменяются эквивалентными native runtime/host integration gates; молча удалить покрытие нельзя.
  6. A/B на одинаковом мире/seed/числе объектов: Windows 5600X/3060 и Mac M5, p50/p95/p99/max frame time, simulation tick, CPU/GPU spans, RSS/VRAM, долгие серии налётов. Проверить restart, отмену/ошибку экспорта и multiplayer chunk replacement. Не обещать FPS только по upstream release notes.
  7. До проверки использовать копии миров/изолированные игровые homes. Обратный gitlink должен откатывать код; для изменившегося формата save заранее сохранить копию данных, git rollback не является откатом миграции мира.

Собственная выполненная в этом проходе проверка: получение release metadata и исходников, точные ancestry/diff, dry merge-tree, два git apply --check. Объединённый клиент не собирался и игровой A/B не выполнялся, поскольку сначала требуется решить runtime-блокер и конфликты. Нельзя выдавать 275 тестов предыдущего среза за проверку нового объединения.

Связано: #72, #87, #88, #89, #96, #102, #104, #124, #125, #126. Приоритет P2 для миграции; выбранные performance backports могут идти раньше отдельными небольшими изменениями.

🤖 Filed by Codex, AI-агент Владимира (chexit). ### Вывод **Обновление имеет смысл, но прямой переход на текущий upstream несовместим с AirDef.** Это отдельная миграция архитектуры мода и перенесённого рендерера. Краткосрочно есть полезные небольшие backports, не требующие этого перехода. Проверка 6 ноября 2026 по исходникам, release API, истории Git и `git merge-tree`. Ничего не мержилось и не публиковалось в кодовых ветках. ### Закреплённые версии | Компонент | Проверенный SHA / база | |---|---| | AirDef main | `1a693763fdf98916a39b394bb512340cc84bac87`; HORIZON_COMMIT=`b6c936f82b08798057161bdfa577e3aac53fb91e`, v0.2.93 | | AirDef kimi-work при проверке | `0b645d77e9497f1598ef6808e477c7e26aa87bd5` | | Текущий gitlink/форк движка | `278f356aa604fa21c2d15d0081823bbe0f891df2`; база `a3acb5f0d2f59d2d5ff21a5aa000809ba1e35e2f`, v0.2.97, 60 собственных commit objects поверх общего предка | | Последний опубликованный Nightly, полученный из release API | `66f3981f522b24c250b21523a70080965b940424`, Nightly 2026-11-05; immutable source tag `nightly-source/2026-11-05-66f3981` | | Отдельно просмотренный снимок upstream main | `a1ff75a4a525b6a9e1ed68f74cf9d54161596370`; не приравнивается к опубликованному Nightly | В upstream [release-flow](https://github.com/horizon-rust/horizon/blob/main/docs/release-flow.md) с 28 октября движок выпускается только как Nightly. v0.2.97 помечен устаревшим; новые `launcher@0.2.xx` — отдельные выпуски лаунчера. Ждать нового «stable v0.2.98» вместо решения о миграции — не действующий план обновления. #72 касается предыдущего шага .93→.97, уже выполненного в kimi-work. Эту issue не следует трактовать как повтор #72 или автоматически закрывать #72 за владельца. ### Подтверждённый блокер: WASM больше не исполняется [0c9a49390](https://github.com/horizon-rust/horizon/commit/0c9a49390ed1cac596e7db45c7d6d8e18e988db9) удаляет WASM runtime, SDK, WIT и sandbox test harness. Предшествующее изменение убирает выполнение WASM code mods из игры. В [новой документации](https://github.com/horizon-rust/horizon/blob/66f3981f522b24c250b21523a70080965b940424/docs/mods.md) .hmod — только content/data/assets; исполняемый код — native .hnmod, меняющий исходники перед сборкой игры. `cargo horizon-mod build` отказывает папке с Cargo.toml, sandbox `test` удалён. Остаточный wasmparser у registry не означает сохранённого runtime. AirDef всё ещё зависит по path от `horizon-mod-sdk` и пакует исполняемый WASM. Поэтому замена gitlink/бинарника на upstream не просто «может» нарушить совместимость: **исчезает сам путь сборки/загрузки нынешнего кода мода**. Сохранение расширения .hmod у content mods это не исправляет. ### Реальная сложность объединения Проба без изменения рабочего дерева: ```sh git merge-tree --write-tree 278f356aa604fa21c2d15d0081823bbe0f891df2 66f3981f522b24c250b21523a70080965b940424 ``` Exit=1, **76 конфликтующих путей/сообщений**: 18 content conflicts, 18 modify/delete, 40 file-location из-за переездов. Последние 40 не равны 40 независимым сложным алгоритмическим конфликтам, но требуют корректного размещения и wiring. Upstream выделил `horizon-client-render`; наши HD `gfx/hd/*`, smoke, scene post, изменённые terrain/entity shaders должны быть перенесены туда и согласованы с новым Renderer. Есть конфликты в game.rs, mods.rs, remote.rs, WIT/runtime/SDK, упаковщике, LAN, lib и shaders. Между базой .97 и Nightly меняется 3131 путь; +1,011,007/−91,030 строк включают generated/docs и не являются оценкой числа переписанных вручную строк. История включает 13787 commit objects / 3701 first-parent commits; это не число уникальных исправлений. **Чистое разрешение Git-конфликтов не докажет сохранность функциональности.** Особенно уязвимы live/history world queries (#105), замена серверных чанков, акустика/invalidation/worker bookkeeping, съёмочные камеры и MP4 cleanup, HD post, model normals, autosave и часы replay/export. ### Что полезно забрать уже сейчас 1. **Рост staging-памяти при увеличении геометрии:** [f7b77fbc8](https://github.com/horizon-rust/horizon/commit/f7b77fbc8844e8dd4d49ea1db29c04cce1c2868c). Старый StagingBelt держит отдельные oversized buffers под постепенно увеличивающиеся записи. Upstream округляет oversized staging allocation до степени двойки, копируя только фактическую длину. В текущем форке `gfx/upload.rs` ещё старый; общий entity batch в `gfx.rs` загружается через него каждый кадр. Это релевантно большим динамическим моделям AirDef. **Патч проходит `git apply --check` на текущем форке после замены только пути client-render→client.** Это подтверждает текстовую переносимость; собственный runtime/GPU замер удержанных буферов здесь не выполнялся. Перенести также upstream-тесты роста и readback, проверить память на налёте и после его окончания. 2. **Windows/Vulkan, лишняя синхронизация при VSync off:** [da4ded1d7](https://github.com/horizon-rust/horizon/commit/da4ded1d7cf9b750160a039244d2e07efd7c9207), gfx-rs/wgpu#10714. Fence остаётся для FIFO, где он нужен для pacing, и не сериализует кадры без VSync. В текущем форке исправления нет. **Полный патч проходит `git apply --check` без поправок**, включая notices. Кандидат для ПК 5600X/3060 только если используется Windows+Vulkan и VSync off; не объясняет автоматически все просадки и не исправляет Metal/DX12. Проверить FIFO/Immediate/Mailbox, DXGI-путь и GPU capture на Windows. 3. **Микрофризы дальнего рельефа:** [cb6a80698](https://github.com/horizon-rust/horizon/commit/cb6a80698ce8d0207e4ffbf4b1a06e88fb22708a) — бюджет применения результатов вместо полного drain за кадр; далее warming reductions на worker. Архивированный upstream A/B полезен как основание для исследования, но не является измерением AirDef. Для backport проверить зависимости LOD и сохранность query/streaming. Не брать один early-return без всего контракта backlog. 4. **Освобождение arena pages вне render thread:** [#6687](https://github.com/horizon-rust/horizon/pull/6687), далее освобождение разреженных страниц; потенциально полезно для p99 кадров и памяти. **GPU culling** [e62b4a1ea](https://github.com/horizon-rust/horizon/commit/e62b4a1eae77cffe6763d436f4e1a6bc9ccdfc24) относится к штатным entity paths; автоматически не ускоряет все самодельные `set-models` инстансы мода. Нужен профиль конкретного пути, не обещание «все ракеты теперь отсекаются GPU». 5. Upstream развивает HDR/float frame и совместимость shader packs. **Разделять наличие в Nightly и main:** [Shader API 0.2 #9930](https://github.com/horizon-rust/horizon/pull/9930), commit `bd186dc7321cadc471c18b5ff232718a435a9ccc`, есть в просмотренном main, но **не является предком Nightly 66f3981**. PR сохраняет 0.1 и вводит экспериментальный контракт linear light; сам по себе ещё не означает полный linear HDR pipeline. Это важная точка согласования с #124/#125, но не готовые DLSS/MetalFX/RT. ### Варианты дальнейшего пути | Вариант | Что получаем | Цена и ограничение | |---|---|---| | Временно сохранить текущую базу и брать выбранные исправления | Быстрее проверить память/pacing, не ломая весь мод | Долг расхождения растёт; нужна дата/условие возврата к миграции | | Перенести адаптер AirDef на native, сохранив airdef-core | Соответствие новому upstream, прямой host access и меньше WASM marshaling | Порт UI/render/audio/world/storage и специального функционала форка; новый build/install; native выполняется с правами игры, без прежней WASM-песочницы | | Сохранить WASM как свой compatibility layer поверх нового upstream | Меньше изменений в публичном API самого AirDef | Поддерживать свой runtime/SDK/WIT/упаковщик/тесты, встраивать lifecycle в новый Game/Renderer; upstream больше это не поддерживает. Не равно копированию назад одного crate | **Предварительная рекомендация:** сначала два небольших backport выше с замерами. Параллельно не запускать гигантский merge «исправлять пока соберётся»: сначала короткий native-прототип и инвентаризация возможностей, затем решение native adapter vs собственный WASM layer. Долгосрочно native лучше совпадает с направлением upstream и уже выделенным core, но полнота host API для наших камер, post-processing, звука и world-history должна быть доказана прототипом. Не переписывать боевое ядро лишь из-за смены runtime. ### План и приёмка миграции 1. Зафиксировать source SHA опубликованного Nightly; отдельная migration-ветка, старый проверенный gitlink сохраняется. Не зависеть от двигающегося `nightly`/`main` без SHA. 2. Составить матрицу: tick/command/input, HUD/карта, модели/частицы/свет/post, звук и acoustics, world live/history/queries, storage/save, replay/camera/export. Для каждой строки — существующий upstream native API, нужное расширение и проверка. 3. Вертикальный прототип: native adapter вызывает тот же core; один комплекс и цель, реальный voxel trace, изображение и звук, сохранение и короткий replay/export. Убедиться, что thread/lifecycle ownership корректен на server-thread и in-frame путях. 4. Переносить HD/акустические/world-history изменения тематическими коммитами; после каждого этапа сохранять результаты проверок. Generated API/hooks не править слепым выбором ours/theirs. 5. Native core/scenario tests остаются. WASM contract/budget tests либо сохраняются для compatibility layer, либо заменяются эквивалентными native runtime/host integration gates; молча удалить покрытие нельзя. 6. A/B на одинаковом мире/seed/числе объектов: Windows 5600X/3060 и Mac M5, p50/p95/p99/max frame time, simulation tick, CPU/GPU spans, RSS/VRAM, долгие серии налётов. Проверить restart, отмену/ошибку экспорта и multiplayer chunk replacement. Не обещать FPS только по upstream release notes. 7. До проверки использовать копии миров/изолированные игровые homes. Обратный gitlink должен откатывать код; для изменившегося формата save заранее сохранить копию данных, git rollback не является откатом миграции мира. Собственная выполненная в этом проходе проверка: получение release metadata и исходников, точные ancestry/diff, dry merge-tree, два `git apply --check`. **Объединённый клиент не собирался и игровой A/B не выполнялся**, поскольку сначала требуется решить runtime-блокер и конфликты. Нельзя выдавать 275 тестов предыдущего среза за проверку нового объединения. Связано: #72, #87, #88, #89, #96, #102, #104, #124, #125, #126. Приоритет P2 для миграции; выбранные performance backports могут идти раньше отдельными небольшими изменениями.
Author
Owner

🤖 Agent: Kimi Code, с реализацией от DeepSeek V4.1 Flash Fast и последующим ревью/проверкой.

Первый рекомендованный backport выполнен в kimi-work (3db1b73), engine 94b572cd2 ветки agent/130-staging-memory.

Перенесён upstream f7b77fbc8: oversized StagingBelt allocations округляются до степени двойки и переиспользуются, а копируются только фактические байты. Вместе перенесён GPU growth/readback regression. Проверка: cargo test -p horizon-client --lib gfx::upload::tests — 3/3 на реальном Metal adapter; полный python3 tools/airdef.py game — успешно. API30 не изменился.

Issue не закрываю: это только пункт про staging-память, не миграция на Nightly. VSync/pacing, дальний рельеф, Windows/Vulkan и долгий RSS-профиль остаются.

🤖 Agent: Kimi Code, с реализацией от DeepSeek V4.1 Flash Fast и последующим ревью/проверкой. Первый рекомендованный backport выполнен в `kimi-work` (`3db1b73`), engine `94b572cd2` ветки `agent/130-staging-memory`. Перенесён upstream `f7b77fbc8`: oversized StagingBelt allocations округляются до степени двойки и переиспользуются, а копируются только фактические байты. Вместе перенесён GPU growth/readback regression. Проверка: `cargo test -p horizon-client --lib gfx::upload::tests` — 3/3 на реальном Metal adapter; полный `python3 tools/airdef.py game` — успешно. API30 не изменился. Issue не закрываю: это только пункт про staging-память, не миграция на Nightly. VSync/pacing, дальний рельеф, Windows/Vulkan и долгий RSS-профиль остаются.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#130