Информация по архитектуре игрового сервера

Всем привет.

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

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

Собственно, сейчас я пытаюсь понять, какие паттерны используются в построении серверного приложения, но информации по этому вопросу найти довольно сложно — обычно везде имеют в виду саму модель взаимодействия клиент-сервер, а мне нужно уровнем выше, когда я уже оперирую сущностями игрока, принадлежащих ему объектов, комнат и т.д.

Собственно, что я ищу и может кто-то подскажет, где это найти
1. Простые советы по архитектуре и дизайн-паттернам, которые часто используются
2. Репозитории, где можно посмотреть, как это уже делали умные люди
3. Литература, видео, статьи и т.д. (но кажется, с этим плохо)

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

Не знаю, насколько это важно, но я использую C#, а для транспорта LiteNetLib.

Заранее спасибо.

3333
75 комментариев

Комментарий недоступен

12
Ответить

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

Вот например игрок хочет спавнить объекты. И вот это "спавнить объекты" пораждает в моей голове огромное количество вопросов.

1. Игрок спавить сам не может, иначе теряется авторитарность, может только запросить спавн, верно?
2. Где хранятся заспавненные объекты на сервере? Это звучит как другая зона ответственности, не хочется связывать.
3. Как ассоциировать игрока и его объекты? Массив с указателями на них из общего списка?

3
Ответить

Идеальный core для отправки UDP со всякими примочками от дядюшки Габена : https://github.com/ValveSoftware/GameNetworkingSockets

Для сериализации данных: https://github.com/fraillt/bitseryhttps://github.com/protocolbuffers/protobuf

Для того чтобы не городить велосипед самому : Amazon GameLift

3
Ответить

Это все уровнем ниже, на нем у меня как раз LiteNefLib, а вот как выше организовать - не знаю.

2
Ответить

Одно из главных на первый взгляд не очевидных моментов это использование UDP помимо TCP для репликации многих параметров, советую посмотреть по какому принципу работает мультиплеер в UnrealEngine и даже не обязательно смотреть исходники. Достаточно понять саму идею и зачем это нужно. Можешь почитать ещё как упаковывать данные перед передачей по сети, как один из и приёмов использовать битовые флаги

2
Ответить

Это база, это все есть :)

Я смотрю исходники MLAPI для юнити, код UE читать слишком сложно

2
Ответить

Мне нужно уровнем выше. 

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

1. Игрок спавить сам не может, иначе теряется авторитарность, может только запросить спавн, верно?
2. Где хранятся заспавненные объекты на сервере? Это звучит как другая зона ответственности, не хочется связывать. 
3. Как ассоциировать игрока и его объекты? Массив с указателями на них из общего списка?

Поэтому, мне хочется посмотреть пример какой-нибудь архитектуры, которая отвечает на эти вопросы. 

1
Ответить