d410e2c92d
build / mod (push) Failing after 18s
Preserve the diagnostic trigger, scenario, before/after logs and scope of equivalent counters. Update ground strike guidance, Windows acceptance status and profiler semantics. Co-authored-by: Codex <codex@openai.com>
93 lines
9.0 KiB
Markdown
93 lines
9.0 KiB
Markdown
# Два крупных налёта: проверка стабильности
|
||
|
||
Пользовательский отчёт: AirDef часто перестаёт работать при двух больших налётах,
|
||
резкого обвала FPS перед этим не замечено. RTX 3060 + Ryzen 5600X — около 50 FPS во время налёта.
|
||
Пользователь уточнил: игра продолжает работать, отключается только AirDef; режим эффектов — HD.
|
||
Точный build и старый лог не предоставлены. Horizon архивирует предыдущие логи в `logs/YYYY-MM-DD-N.log.gz`,
|
||
поэтому запись может сохраниться и без ручного копирования.
|
||
Задача: [#122](https://gitea.maoniao.team/chexit/airdef/issues/122).
|
||
|
||
**Воспроизведена и исправлена одна конкретная причина отключения при таком классе нагрузки.**
|
||
Без старого лога не утверждается, что Windows-сеанс имел именно её; GPU/FPS отдельно не измерялись.
|
||
|
||
## Найденная причина и фикс
|
||
|
||
Два максимальных состава меню (11 видов × 40, два принятых приказа), 64 ПВО, расстояние 300,
|
||
HD и grid, обслуживаемый плоский мир: tick 1835 исчерпал ровно 300M fuel и мод остановился.
|
||
Grid, запись и обновление дыма не были необходимы для этого spike: исследовательские абляции
|
||
не убирали остановку. В производственном исправлении эти функции не отключаются.
|
||
|
||
`Ground::forget` при каждом взрыве делал `retain` по всему кэшу известных высот. Тот же полный
|
||
обход выполнялся при обработке просроченных blast replies. Когда приходило много взрывов,
|
||
затраты росли как произведение количества взрывов и размера/ёмкости таблицы высот.
|
||
|
||
`1f28f83` удаляет непосредственно координаты прежнего квадрата: при радиусе 8 это 17×17 ключей,
|
||
а не просмотр всей таблицы. Вызов `world.touched` сохранён. Тест сравнивает весь результат со
|
||
старым predicate, включая отрицательные координаты и границы; правила урона и лимиты не менялись.
|
||
|
||
Контрольный диагностический гость с полными записью, дымом, HD и grid, без phase markers:
|
||
421 шаг, 3602 тика — PASS; max tick fuel 135273690/300M, command 92658271/1B, failures=0.
|
||
Финальные показатели: 0 в воздухе, 209 сбито, 3435 поражений, 15 столкновений.
|
||
На тике 1834 до прежней остановки вывод `/stats` до/после совпал побайтово,
|
||
включая счётчики мира. Это не утверждение о равенстве каждого скрытого поля симуляции.
|
||
|
||
Для воспроизведения огромного меню-состава использован временный hook команды mix,
|
||
вызывающий тот же `WaveConfig/order_raid`; сам hook **не входит в мод**.
|
||
Исходник — `10f24b5`, после фикса добавлен только новый `forget`. Данные, hook и точный
|
||
сценарий: [summary.json](measurements/max-raid-fuel/summary.json),
|
||
[trigger.patch](measurements/max-raid-fuel/trigger.patch),
|
||
[scenario.toml](measurements/max-raid-fuel/scenario.toml),
|
||
[до](measurements/max-raid-fuel/before.txt), [после](measurements/max-raid-fuel/after.txt).
|
||
Patch предназначен для отдельного диагностического worktree, а не для обычной игры.
|
||
Два checkpoint-лога намеренно заканчиваются несовпадением с `probe`, чтобы получить `/stats`;
|
||
это не реальные traps. Успешный полный прогон отдельно в `after.txt`.
|
||
|
||
Публичный native-тест `two_maximum_menu_raids_with_answered_flat_terrain` использует настоящий
|
||
максимальный `RaidOrder` без hook, terrain replies и запись. Он также прошёл.
|
||
|
||
## Найденные пробелы старых тестов
|
||
|
||
В первом `wasm_budget.toml` два приказа отправлялись без тика между ними. `order_raid` отклоняет
|
||
второй во время подготовки первого; ответ не проверялся. Кроме того, TestGame не отвечал на
|
||
render ground/sections/rays: пуски могли ждать неизвестную землю вместо полноценного полёта.
|
||
69 успешных шагов не подтверждали 160 одновременно летящих целей. Старый отчёт сохранён с поправкой.
|
||
|
||
## Что проверено теперь
|
||
|
||
- Native: точный состав двух меню-пресетов «Массированный удар», 61 комплекс, плоский мир с
|
||
ответами геометрии и встроенной записью. Оба приказа приняты, все 72 цели запущены,
|
||
перекрытие проверено по числу одновременно живых целей.
|
||
- Native: два приказа 40+40 «Орешников» с разделением, многими суббоеприпасами и окончанием записи.
|
||
- Actual WASM: 64 комплекса, два принятых приказа 40+40 «Орешников», плоскость y=64 с ответами
|
||
ground/sections/rays. В середине включаются shader hd и grid. 271 шаг прошёл;
|
||
на тике 2102 проверено **184 цели в воздухе**. Пик за весь прогон не измеряется.
|
||
- Кадры чередуются с тиками. 2052 вызова frame стенда не означают GPU-рендер:
|
||
у AirDef нет собственной реализации frame hook, основная работа идёт в tick и событиях.
|
||
|
||
Отчёт clean `2932364`, engine `ed7615d36`:
|
||
[flat-wasm-raid-budget.json](measurements/flat-wasm-raid-budget.json).
|
||
Memory 64 MiB и fuel init/tick/frame/event 2B/300M/10M/1B не увеличивались.
|
||
Отчёт фиксирует исходные лимиты, не измеренный расход fuel/peak memory.
|
||
|
||
```sh
|
||
python3 tools/airdef.py test-budgets
|
||
cargo test --release --manifest-path airdef-core/Cargo.toml --test scenarios overlapping_
|
||
```
|
||
|
||
Это проверка гостевого кода и контрактов с синтетическим host-миром. Она не воспроизводит
|
||
RTX-драйвер, реальный рельеф/чанки, звук и стоимость HDR, shadow/light/smoke на GPU пользователя.
|
||
Включение HD в fixture проверяет путь подготовки модовых данных, а не графическую производительность.
|
||
|
||
## Диагностика следующего воспроизведения
|
||
|
||
В `latest.log` после остановки теперь записываются mod ID, callback, заданный и оставшийся fuel,
|
||
полная цепочка ошибки. Сообщение OutOfFuel больше не объявляет тяжёлую работу бесконечным циклом.
|
||
Проверка настоящим WASM `/spin` подтверждает, что при fuel trap останавливается только нарушивший мод.
|
||
Это не доказывает, что пользовательский случай имеет ту же причину.
|
||
|
||
Нужны build identity и строки Windows `latest.log` вокруг остановки, состав двух налётов,
|
||
HD/обычный профиль, открытые grid/monitor/replay и ответ: закрылась ли игра целиком.
|
||
До этих данных не подменять диагноз увеличением fuel, отключением записи или обрезанием целей.
|
||
Измерение FPS вести отдельно от поиска trap: стабильный FPS не исключает лимит WASM, а прошедший
|
||
WASM-тест не исключает ошибку GPU или native host.
|