Дневник разработки №49: История одного бага

В ходе тестирования проекта The Great Tribes тестеры, время от времени, встречали очень странную ошибку: на карте появлялись юниты, стоящие на воде. Однако воспроизвести этот баг напрямую не удавалось.

Иисус
Иисус

Баг был очень редким и у нас даже появился локальный мем - “Это не баг, это зарождение новой религии в игре”.

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

Я проштудировал весь код и перепроверил все алгоритмы связанные с перемещением юнитов по карте. Причин я не нашел, баг так и не воспроизвел.

В рамках подготовки странички в Steam понадобились юниты с большим радиусом обзора и я сделал 50 тайлов обзора. И тут подобные баги стали вылазить с завидной регулярностью. Я генерировал карты в поисках красивых мест чтобы можно было сделать красивые скриншоты для гифок. Лишь в момент серии генераций карт я смог воспроизвести этот баг.

Баг
Баг

Я заметил закономерность, раньше я запускал проект в IDE, генерировал карту, что-то проверял и выходил из игры. Но как только я делал повторную генерацию, не выходя из главного меню, этот баг очень часто проявлял себя.

Все взаимодействия мира на сервере шли через один глобальный синглтон ServerContainer. При повторной генерации карты новый сервер запускался, но ServerContainer оставался старый, с ссылками на старые юниты и ошибками связи между данными.

У меня был реализован метод cleanup() у ServerContainer, который очищает все критические данные после выхода из игровой партии. Часть ресурсов (кэшированные шаблоны и настройки) сохранялось для ускорения работы генерации карты.

После этого причина нашлась моментально. Я просто забыл вызвать этот метод при выходе с сервера.

Причина - отсутствие вызова этого метода
Причина - отсутствие вызова этого метода

Не совершайте таких ошибок! Всем удачи и хорошего настроения!

7
8 комментариев