Какие существуют технологии взаимодействия между пользователями в играх с комнатами?
Здравствуйте,
есть популярные игры, где в комнате сидят несколько игроков и взаимодействуют друг с другом. Дарят подарки друг другу, вращают бутылочку, общаются в общем чате.
Посмотрел в консоли разработчика - увидел что с сервером нет взаимодействия. Значит клиентская часть как-то синхронизируется друг с другом без участия сервера. Тут много плюсов, и быстрое появление сообщений в чате и снятие нагрузки с сервера.
Как называется эта технология? И я так понимаю, что в таких играх это самый правильный способ организации взаимодействия между пользователями в играх с комнатами?
У нас социалка работает через flash.net.Socket и держит постоянное соединение с сервером. Сервер на Java.
В консоли разработчика эту активность естественно не видно.
Из плюсов, мгновенная реакция на события и возможность обратной связи (те сервер сам может послать клиенту событие), а не дожидаться пока клиент пошлет ему запрос, что бы узнать не произошло ли чего.
Из минусов -- больше нагрузка на сервер, тк приходится постоянно держать открытые сокеты, на каждого пользователя. А так же усложняется разработка и масштабирование сервера.
Насчет правильности не уверен. Сейчас, если ты делаешь ферму\хог\три-в-ряд, то скорее всего такой сервер добавит тебе головной боли.
Сейчас начинаем новый проект и смотрим в сторону REST-стиля.
На сервлетах можно реализовать оба варианта. У нас сервер запускается отдельным инстансом. Но некоторые дополнительные тулзы реализованы в виде сервлетов.
Евгений: то есть это нормально, что игра вроде Бутылочки, с комнатами, общим и личным чатом делается не на сокетах, а на обычном частом опросе сервера каждым клиентом для получения состояния комнаты и сообщений в чате?
Игорь Самохин: Для чатов лучше использовать готовое решение в виде XMPP\IRC, прикрутив его в клиент игры.
Мне кажется что в случае, когда тебе нужен мгновенный ответ от другого пользователя, лучше использовать сокеты, чем делать постоянные запрос.
Только не создавать процесс на каждый открытый сокет по потоку, а используй пул, как это сделано в nginx, например habrahabr.ru/post/260065
Еще есть решение, как это сделано в вк. Клиент посылает post-запрос и это запрос висит. Как-только на сервере возникают события, сервер отвечает на этот запрос и закрывает его, или он сам отваливается по time-out. После закрытия запроса, клиент тут же посылает новый и снова ждет ответа.
К сожалению не помню как это называется и не скажу про эффективность. Но думаю в вк сидят не дураки и навскидку этот метод лучше постоянной посылки холостых запросов.
это бекенд. выделеный сервер можно взять конечно, но балансировать нагрузку и писать всю логику придецо самому, а BaaS это уже готовый бекенд. некоторые типа PlayFab узко-заточены и готовы к использованию (буквально пару строк добавить в игру и полетели), а есть такие как Parse, которые не только для игр и там нужно писать свою логику в скриптах, но это намного легче чем писать свой сервер с нуля, да и нагрузка в Parse опять же будет балансировацо. Кароч фишка готового бекенда в том что на него уйдет намного меньше времени по настройке и интеграции и он не ляжет когда в игру придет волна новых пользователей
ну если бы вы почитали про функционал то поняли бы что эти сервисы предлагают:
-регистрацию конкретного игрока в системе
-хранение и синхронизацию данных для конкретного игрока
-хранение глобальных игровых данных
-кастомная логика обработки поступающих данных
-системы lobby и matchmaking (хз как это по-русски)
-внутриигровые покупки
не все системы предлагают весь список да и не нужен он для всех игр, некоторые предлагают даже еще больше. смысл в том что этого достаточно что бы реализовать бекенд практически для любой игры. ну правда если это battlefield10 или WoW-Killer9000 то лучше строить свой датацентр и писать свой бекенд, что бы уж точно не упало ничего от милиардов игроков)