Пятничные факты #299 – Все сложнее, чем ожидалось

опубликовали kovarex

Возможно, вы заметили, что во время этих прошлых релизов было сломано много вещей, связанных с рельсами, и теперь они снова работают более или менее нормально. История за этим не так тривиальна.

Логика сигналов

Логика железнодорожных сигналов для автоматизированных поездов довольно проста:
Когда поезд движется вперед, он пытается зарезервировать перед собой сигналы. Если он может зарезервировать сигнал, весь блок, охраняемый сигналом, резервируется для поезда. Если поезд не может зарезервировать сигнал, так как блок зарезервирован или занят другими поездами, он останавливается перед сигналом и ждет. Как только поезд проходит сигнал и входит в новый блок, он удаляет резервирование для сигнала и блок  зарезервированный. Как только он выходит из блока, блок может быть зарезервирован другими поездами.

Это выглядит красиво и просто, ничего плохого не может произойти с этой логикой, верно? Тем более, что он у нас там почти пять лет, и все это работает, верно?

Если бы ответом было «Да», это было бы довольно глупо, поэтому ответ «Нет» :).

Контрпример

Так  в этом примере поезд приближается справа. Проблема в том, что он резервирует блок номер 2 дважды, поскольку существует специальное правило, согласно которому поезд может войти в зарезервированный или занятый блок, если он зарезервирован сам по себе

Поскольку поезд зарезервировал блок 2 дважды, но удалил оба резервирования блока второе резервирование, на которое поезд все еще рассчитывает, не применяется к блоку 2, и блок в основном открыт для любого другого поезда для входа Это может привести к коллизиям и, что удивительно, к рассинхронизации, поскольку мы не сохраняем резервирование блоков, а выводим их из резервированых сигналов во время загрузки игры..

Решение

Как только проблема была идентифицирована, решение было довольно простым. Я добавил поддержку для блока, который должен быть зарезервирован несколько раз, удаление резервирования уменьшает счетчик, и блок освобождается, только если все резервирования удалены.

Но настоящие ошибки и проблемы начались позже, потому что теперь мы должны быть уверены, что блок зарезервирован ровно столько же раз, сколько и снят с резервации. Логика вокруг этого была далека от жесткой, поскольку в ней просто не было необходимости. Несколько строгих проверок были добавлены повсеместно, чтобы убедиться, что внутренне несовместимое состояние не появляется, так как мы действительно не хотим исправлять эти ошибки «этот блок закрыт навсегда» там, где он будет закрыт. невозможно понять, как игра попала в такое состояние.

P.S. Поскольку теперь мы можем использовать остановки поездов в качестве путевых точек, не только блоки, но и железнодорожные сигналы могут быть зарезервированы более одного раза, так как поезд может планировать путь по кругу и резервировать один и тот же сигнал дважды по пути.

Эффект

Вы можете увидеть, как внутренние изменения в рельсах повлияли на количество отчетов о сбоях, но, надеюсь, скоро они вернутся в норму.

Ну, вы не можете приготовить омлет, не разбив несколько яиц … но в целом тенденция к стабильности сохраняется.

Как всегда, дайте нам знать, что вы думаете на нашем форуме.

Comments: