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>
9.0 KiB
Два крупных налёта: проверка стабильности
Пользовательский отчёт: AirDef часто перестаёт работать при двух больших налётах,
резкого обвала FPS перед этим не замечено. RTX 3060 + Ryzen 5600X — около 50 FPS во время налёта.
Пользователь уточнил: игра продолжает работать, отключается только AirDef; режим эффектов — HD.
Точный build и старый лог не предоставлены. Horizon архивирует предыдущие логи в logs/YYYY-MM-DD-N.log.gz,
поэтому запись может сохраниться и без ручного копирования.
Задача: #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,
trigger.patch,
scenario.toml,
до, после.
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.
Memory 64 MiB и fuel init/tick/frame/event 2B/300M/10M/1B не увеличивались.
Отчёт фиксирует исходные лимиты, не измеренный расход fuel/peak memory.
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.