Разработка мобильной RTS стратегии с полного нуля (Часть 1.А) - Astra Sim Engine

Часть 0:

Как и обещал, в этом посте подробно расскажу, как будет работать моя игра со стороны сервера, и для чего разрабатывается Astra Sim Engine. Изначально я хотел продемонстрировать реализацию протокола обмена между клиентом и сервером, но поскольку в этой реализации не будет всех запланированных сервисов, то эту часть я разделил на две (А и Б), в этой части будет описана общая концепция симуляционного серверного движка, когда как в Б будет уже демонстрация работы реализованных сервисов.

Немного введения

При разработке любой многопользовательской игры, перед разработчиком стает выбор, как организовать передачу данных между игроками, таких метода по факту 2:

  • Peer-to-Peer (P2P) - каждый игрок соединяется напрямую с другими.
  • Клиент-Серверная модель - все игроки подключаются к центральному серверу.

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

Общее взаимодействие с другими программными компонентами

Концепт взаимодействия администратора-сервера-клиента
Концепт взаимодействия администратора-сервера-клиента

Необходимо будет разработать три программных комплекта для игры:

  • Astra Project - клиент игры на Unity, должен содержать в себе, очевидно, клиентскую логику и реализацию протокола обмена со стороны клиента (Сервиса Interface);
  • Astra Sim Engine - игровой сервер, в виде консольного C++ приложения, должен обеспечивать прием и передачу данных от клиентов и администратора(-ов), реагировать на команды, обеспечивать симулцию систем и сохарнение данных о Галактике и пользователях в БД;
  • Astra Sim Inspector - клиент администратора, графическое приложение, скорее всего будет сделано на QT, так как Unity-клиент высотупает в роли конечного пользователя, то он лишен возможности манипуляции сервисами движка (Клиент не сможет просто так взять и создать в системе новую планету или произвольно менять обхекты в ней), однако пересобирать или в ручную редактировать конфигурацию Галактики - сильно усложнит, как отладку сервера, так и его поддержку.

Структура и состав Astra Sim Engine

В этой части расскажу в общем про Astra Sim Engine, на примере его состава, в последующих частях я буду подробнее описывать работу каждого сервиса, а также приводить демонстрацию его работы (Когда он будет в удовлетворительном виде)

Основной упор в моем движке будет на использование многопоточных вычислений, т.е. обработка UDP-клиентов по классике будет реализована в отдельных независимых потоках, так и симуляция каждой системы (При наличии в ней динамических объектов) также будет выполняться в отдельных потоках, потому и был сделан выбор в использовании потокобезопасной Базы Данных.

Схема сервисов и программных комплектов Astra Sim Engine
Схема сервисов и программных комплектов Astra Sim Engine
  • Main - фундамент любой программы, по сути точка входа, в ней же реализован обработчик команд из консоли (При подключении к серверу по SSH), команды (command) относятся к сервисам и позволяют проверить работу или вызвать определенное действие сервиса;
  • Core - программный комплект, в котором будут описаны базовые классы движка (Потоки и потокобезопасный обмен данными);
  • Dispatcher - важнейший сервис, обеспечивающий организацию потоков, управление ими, обработку обмена данными, контроль времени выполнения и другие функции, которые следует ожидать от диспетчера;
  • Manifest - конфигурационный сервис, необходим для проверки соответсвия версий клиента и сервера, в свою очередь он также определеяет, что и в каком виде должен загружать диспечтер;
  • Interface - сервис для обеспечения сетевого подключения, должен обеспечивать обработку, как TCP пакетов от клиентов, так и формировать отдельные потоки для UDP пакетов;
  • Galaxy - сервис для работы с БД Галактики и пользователей, по большей части это функциональный сервис, выдающий SQL команды;
  • Log - сервис для отображения и сохранения событий движка, классика;
  • Handler - важный сервис, который обеспечивает корректную симуляцию и соответсвие данных в симулируемых системах данным из БД;
  • Collection - сервис предоставляющий функции и классы игровых объектов, а также вызовы от серивса event;
  • Event - сервис, задача которого в связи объектов и команд клиента с объектами на сервере, т.е. данный сервис должен по команде от клиента проверить наличия связанного объекта в симуляции и/или выполнить действие над ним, а также через этот сервис передаются и события от объектов со стороны сервера.

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

Заключение

Хотелось бы услышать мнение у читателей, по поводу структуры Astra Sim Engine, я с радостью могу сейчас ответить на вопросы про работу конкретных сервисов и симуляции в целом.

Следующая часть будет посвящена проектированию внутриигрового интерфейса.

5
2 комментария