[bug] Кэш коллизий не инвалидируется при выгрузке и повторной загрузке чанка #62

Closed
opened 2026-10-29 21:11:26 +00:00 by chexit · 1 comment
Owner

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

Ревью 6f3fc644bc5194311a86baba722bc340215306b7. Новая подписка render.world-changes охватывает отдельные World::set, но пропускает замену и жизненный цикл целых чанков. Из-за этого геометрия в моде может расходиться с реальной бесконечно долго.

Подтверждено чтением путей записи

Патч 24, engine:

  • crates/horizon-client/src/world.rs::World::set вызывает mod_changes.note только при поштучной смене state.
  • streaming.rs::Streaming::insert_remote напрямую заменяет world.chunks.insert(...), forget делает world.chunks.remove(...); подписку не уведомляют.
  • game/remote_chunks.rs::remote_chunk использует именно insert_remote при получении колонки сервера (в том числе в штатной single-player игре на server thread).

Мод: sim/world.rs::touch перечитывает только stale или Unknown с истёкшим RETRY. Известные Empty/Full/Mixed не имеют срока актуальности. При пропущенном изменении они не обновятся даже при постоянном использовании.

Сценарий

Закэшировать пустую секцию; уйти до выгрузки чанка; изменить её на сервере/другим игроком; вернуться и получить целый новый chunk packet со стеной. Мод продолжит считать секцию Empty, дроны пройдут сквозь стену. Обратный случай — удалённая стена останется невидимым препятствием. При unload известное содержимое продолжает выдаваться вместо Unknown. Это вывод из указанных путей кода; игровой сетевой прогон не выполнялся.

Нужно

Уведомлять о load/unload/replace колонок (и local streaming путях, где обходится World::set), связывать cache entry с поколением/revision. Для unload выдавать Unknown; для replace перечитывать секции. Не очищать весь кэш на каждый пакет light update: изменения только света не меняют collision geometry.

Приёмка

Две стороны замены Empty↔Solid, unload/reload, server thread и in-frame, новые чанки после Unknown, ограничение объёма событий. Счётчики revision/invalidated отражают событие без ожидания случайного World::set.

Связано с #43 и холодным Unknown из отдельной задачи; это самостоятельная потеря инвалидаций уже известной геометрии.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `6f3fc644bc5194311a86baba722bc340215306b7`. Новая подписка `render.world-changes` охватывает отдельные `World::set`, но пропускает замену и жизненный цикл целых чанков. Из-за этого геометрия в моде может расходиться с реальной бесконечно долго. ### Подтверждено чтением путей записи Патч 24, engine: - `crates/horizon-client/src/world.rs::World::set` вызывает `mod_changes.note` только при поштучной смене state. - `streaming.rs::Streaming::insert_remote` напрямую заменяет `world.chunks.insert(...)`, `forget` делает `world.chunks.remove(...)`; подписку не уведомляют. - `game/remote_chunks.rs::remote_chunk` использует именно `insert_remote` при получении колонки сервера (в том числе в штатной single-player игре на server thread). Мод: `sim/world.rs::touch` перечитывает только stale или Unknown с истёкшим RETRY. Известные Empty/Full/Mixed не имеют срока актуальности. При пропущенном изменении они не обновятся даже при постоянном использовании. ### Сценарий Закэшировать пустую секцию; уйти до выгрузки чанка; изменить её на сервере/другим игроком; вернуться и получить целый новый chunk packet со стеной. Мод продолжит считать секцию Empty, дроны пройдут сквозь стену. Обратный случай — удалённая стена останется невидимым препятствием. При unload известное содержимое продолжает выдаваться вместо Unknown. Это вывод из указанных путей кода; игровой сетевой прогон не выполнялся. ### Нужно Уведомлять о load/unload/replace колонок (и local streaming путях, где обходится World::set), связывать cache entry с поколением/revision. Для unload выдавать Unknown; для replace перечитывать секции. Не очищать весь кэш на каждый пакет light update: изменения только света не меняют collision geometry. ### Приёмка Две стороны замены Empty↔Solid, unload/reload, server thread и in-frame, новые чанки после Unknown, ограничение объёма событий. Счётчики revision/invalidated отражают событие без ожидания случайного World::set. Связано с #43 и холодным Unknown из отдельной задачи; это самостоятельная потеря инвалидаций уже известной геометрии.
chexit added the area:simulationtype:bugpriority:P2 labels 2026-10-29 21:11:26 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#62