Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 

Repository files navigation

serializing-state - Сохранение состояния игрового сервера с помощью Boost.Serialization

Проект для портфолио | C++20 | CMake | Boost

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

Сервер теперь может сохранять всё своё состояние (динамические объекты, токены игроков и т.д.) в файл и восстанавливать его при запуске, обеспечивая непрерывность работы между перезапусками.

Реализация использует Boost.Serialization для удобной сериализации объектов и интегрируется с существующей обработкой сигналов и игровыми часами сервера.

⚙️ Сборка и запуск

Требования

  • C++20
  • CMake 3.11
  • Boost 1.78.0

Сборка

git clone https://github.com/Rinalii/serializing-state.git
cd serializing-state/solution
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .

Запуск

bin/game_server -c ../data/config.json -w ../static/ -t <tick-period> --st <state-file> --sv <save-state-period>

🧱 Возможности

🔹 Настройка через командную строку:

  • --state-file <путь> – задаёт файл для сохранения/загрузки состояния игры.
  • --save-state-period <мс> – устанавливает интервал (в игровом времени) для автоматического создания снимков состояния.

🔹 Корректное завершение работы

  • При получении сигналов SIGINT или SIGTERM сервер автоматически сохраняет текущее состояние в указанный файл.

🔹 Автоматические периодические сохранения:

  • Синхронизированы с игровыми часами (ручные запросы /api/v1/game/tick или автоматические тики, если задан параметр --tick-period).
  • Сохранение происходит только тогда, когда с момента последнего сохранения прошло не меньше указанного периода.

🔹 Поведение при запуске:

  • Если указан --state-file и файл существует – состояние загружается, и игра продолжается с этого момента.
  • Если файл не существует – сервер стартует «с чистого листа» и создаст файл при завершении или периодическом сохранении.
  • Если файл повреждён или содержит некорректные данные – сервер логирует ошибку и завершается с EXIT_FAILURE.
  • Если параметр --state-file не указан – сервер работает без сохранения состояния.

🔹 Сохраняемые данные:

  • Все динамические объекты на всех картах: собаки и потерянные предметы.
  • Все токены и соответствующие идентификаторы пользователей вошедших в игру игроков.

📁 Процесс сохранения и загрузки

🔹 Сохранение:

  • При завершении работы и при периодических тиках создаётся снимок состояния.
  • Снимок сначала записывается во временный файл, затем переименовывается в целевой – это позволяет избежать повреждения данных.

🔹 Загрузка:

  • Если --state-file указан и файл существует, сервер пытается загрузить его
  • Исключения во время загрузки перехватываются и логируются

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages