Как функционируют игровые сессии в многопользовательских играх (с примером)

Сегодня мы рассмотрим один из возможных жизненных циклов игровых сессий на примере моей онлайн игры Make World. А своим опытом или мыслями вы можете поделиться в комментариях. Рассматривать мы всё будем с технической стороны с небольшими вкраплениями того, как это выглядит для пользователя. А в конце есть ссылка, где вы можете попробовать и покликать это всё на практике, а так же подписаться на мои соцсети 🙂

Итак, всё начинается с создания игровой сессии, это может быть как создание лобби, так и создание сессии через матчмейкинг (автоматический поиск соперников). В нашем случае рассмотрим простой пример с ручным созданием лобби: пользователь жмёт кнопку «Создать» и создается игровая сессия.

Как функционируют игровые сессии в многопользовательских играх (с примером)Создание сессии на клиенте

На стороне сервера же у нас имеются следующие методы (синтаксис языка c#, методы пронумерованы на скриншоте ниже):

1) Создать игру с заданными параметрами (примеры параметров на скриншоте выше)

2) Начать игру (когда пользователь жмёт кнопку)

3) Начать игровые ходы (когда сервер инициализировал все необходимые параметры и готов транслировать состояние игры)

Методы игровой сессии на стороне сервераМетоды игровой сессии на стороне сервера

Учитывая, что игра у нас многопользовательская, и к ней могут подключаться другие игроки, то необходимо приправить нашу сессию вспомогательными методами подключения/отключения игроков (см. скриншот ниже):

1) Подключается игрок. Что мы при этом делаем?

— Смотрим, был ли он уже в этой сессии (это могло произойти, если он играл в игру и отключился из-за пропавшего интернета).

— Если был, то ставим его на нужную ячейку игрока (чтобы у него был доступ ко всем его городам и юнитам в игре).

— Если не был — создаем новую ячейку игрока с базовыми ресурсами для основания города.

2) Убрать игрока. Этот метод доступен, например, хосту игры — если ему по какой либо причине не нравится игрок, а так же доступен самому серверу — если например игра не активна и её необходимо закрыть для экономии ресурсов (об этом будет дальше)

3) Игрок выходит из сессии по одной из причин:

— Потерялось подключение. В этом случае мы оставляем ячейку игрока за ним (чтобы в будущем вернуть ему доступ ко всем его городам и юнитам)

— Он сам нажал кнопку выхода. В этом случае всё интереснее: если мы видим, что в игре не осталось ни одной активной ячейки игрока (т.е. теоретически никто не может вернуться в игру с «восстановившимся» интернет соединением) — то мы переходим к пункту (4) и закрываем игру, таким образом освобождаем ресурсы сервера, чтобы другие игроки тоже могли наслаждаться своими играми «без лагов»

4) Закрытие сессии. Если упустить этот пункт при разработке своей игры/приложения, то рано или поздно сервер будет «захламлен» и производительность может сильно упасть. Поэтому мы вызываем этот метод рано или поздно ВСЕГДА для каждой сессии, в случае моей игры причины этому могут быть:- Все игроки вышли из игры вручную. Когда последний игрок жмёт кнопку выхода — сразу инициализируется закрытие игры.

— Не осталось активных соединений и прошел какой-то промежуток времени (который даётся игроку, чтоб восстановить соединение и продолжить игру).

— Игровые ходы закончились и в игре определился победитель.

Методы манипуляции игроками и закрытия сессииМетоды манипуляции игроками и закрытия сессии

Ну чтож, сегодня мы разобрали базовый цикл игровой сессии (а в более широком смысле почти все «сессии» в компьютерных приложениях работают именно так), и, как и говорил, попробовать всё это бесплатно вы можете тут (и даже на мобильных устройствах): https://plugfox.dev/make-world-ru/

Discord канал: https://discord.gg/gAgTQNZPVh

YouTube канал: https://www.youtube.com/@konungzrage_ru/videos

Telegram канал: https://t.me/+RPOZdEcSz58xZmVi

 

Источник

Читайте также