[bug] Кэш коллизий не инвалидируется при выгрузке и повторной загрузке чанка #62
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 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 из отдельной задачи; это самостоятельная потеря инвалидаций уже известной геометрии.
🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).