В последнее время я занимаюсь разработкой многопользовательской игры в единстве3d. У меня есть довольно хорошая идея о том, как работает MasterServer Unity в единстве.
Но теперь я хочу создать свой собственный игровой сервер с нуля. Я исследовал и узнал, что мы можем использовать Google cloud compute и движок приложения для создания собственного сервера знакомств и хост-сервера игры.
Но я совершенно не знаю, как мы начинаем кодировать мой сервер. Мы делаем это, используя простой HTTP-запрос и результат json? Или есть какая-либо другая техника, которая может работать в режиме реального времени с играми типа FPS. Я не думаю, что отправка HTTP-запросов и ожидание результата может быть достаточно быстрым, чтобы работать в играх типа FPS, где каждые секунды мы отправляем более 100-ти данных.
Сначала я подумал о написании сценариев php и его размещении на каком-то URL-адресе, а затем отправил запрос на этот URL-адрес и дождался его ответа. Но я узнал, что если я использую этот процесс, то для получения только одного ответа с сервера мне потребуется по меньшей мере 0,5 секунды или более. В этом состоянии в игре будет много отставания.
Я знаю, что игровые серверы работают на каких-то сетях tcp или udp. Но мой вопрос заключается в том, какое приложение я должен сделать для сервера, чтобы получать эти данные и быстро отправлять обработанные результаты.
Прежде всего, я думаю, что вы смешиваете MasterServer с подключением, необходимым для отправки и получения игровых данных во время игры.
MasterServer используется для получения информации о сервере, который создал игру, такую как IP-адрес и номер порта. После получения номера IP и порта клиент может напрямую подключиться к серверу с помощью этой информации.
Мы делаем это, используя простой HTTP-запрос и результат json?
Для MasterServer , да, вы можете. Вы также можете использовать его в сочетании с PHP для сохранения игровых сеансов в базе данных.
Например, когда игрок хочет создать новую игру, вы берете информацию о своей игре, такую как имя игры, пароль, максимальные игроки, IP-адрес игрока, номер порта, затем сериализуете его на json и отправляете с помощью RESTful.
Вы можете использовать PHP для получения этой игровой информации и хранить ее на сервере, чтобы другие игроки могли ее найти.
Это не должно влиять на производительность, поскольку вы используете ее только для создания, запроса и уничтожения игровых сезонов. Вы не используете его для отправки игровых данных во время игры.
Что касается отправки данных во время игры, вы делаете это с помощью raw socket. Или TCP или UDP с C # . Идите на родной с C ++, если вы хотите получить максимальную производительность sine Unity UNet написан на C ++ . Большинство серверов FPS написаны на C ++, и это необходимо для обеспечения максимальной производительности.
Помните, что существует множество типов серверов, поэтому я не могу их охватить в этой статье. Я просто сосредоточусь на MasterServer, который сообщает клиенту, что IP-адреса на Games созданы, а затем Relay, который используется, когда невозможно установить прямое соединение между игроками.
Я предлагаю вам использовать Protobuf от Json от Google за его производительность и легкий вес. Если вы обнаружите API-интерфейс сериализации, который быстрее Protobuf, то используйте его.
Прямая связь:
Сервер :
1. Используйте NAT для выполнения перенаправления портов .
2. Создайте игру, создав TCP / UDP-сервер .
3. Отправьте Game Info (название игры, ip, номер порта) на MasterServer.
4. Когда клиент подключается к этой информации, начните отправлять данные путем сериализации данных (позиция игрока FPS?) С помощью отправки Protobuf , клиенту.
5. Когда вы получаете данные от клиента, десериализуйте его с помощью Protobuf .
Клиент :
1. Подключитесь к Мастерсерверу и запустите текущую информацию об игре.
Создайте клиент TCP / UDP и подключитесь к одному из номеров IP и порта.
Чтобы отправлять и получать данные, используйте шаги с сервера №4 и №5 .
Иногда переадресация портов не работает на некоторых устройствах. В этом случае два игрока с разными глобальными IP-адресами не могут соединяться вместе, и в этом случае вступает в действие реле и C ++. Реле не должно выполняться с помощью http-запросов, json или php. Это должно быть сделано с C ++ или некоторым подобным быстрым языком, таким как python.
Опять же, есть много способов сделать это. Самый простой способ – создать закрытый ключ для каждой созданной игры. Когда сервер / клиент отправляют данные друг другу, они должны включать этот ключ в эти данные, и этот ключ будет использоваться для определения, кому сервер ретрансляции должен отправлять данные.
Подключение с реле:
Сервер :
1. Создайте игру, подключившись к отправке игровой информации (название игры) в MasterServer .
2 . MasterServer отвечает, создавая закрытый ключ и возвращая его на Сервер.
3. Подключитесь к серверу ретрансляции с помощью этого закрытого ключа.
4.Чтобы отправить данные другим игрокам, выполните сериализацию данных (положение игрока FPS?) С помощью Protobuf, а затем отправьте на сервер ретрансляции. Эти данные также должны содержать закрытый ключ.
5. Сервер Reway получает данные с этого сервера, считывает закрытый ключ и пересылает / передает данные любому другому клиенту с тем же закрытым ключом.
6. Когда вы получаете данные с сервера ретрансляции, которые отправил другой игрок, десериализуйте его с помощью Protobuf .
Повторяйте с # 4 до # 6, пока соединение все еще живое, и игра еще не закончена.
Клиент :
1. Подключитесь к Мастерсерверу и запустите текущую информацию об игре.
2 . MasterServer отвечает, возвращая личный ключ этой игры клиенту.
3. Подключитесь к серверу ретрансляции с помощью этого закрытого ключа.
4.Чтобы отправить данные другим игрокам, выполните сериализацию данных (положение игрока FPS?) С помощью Protobuf, а затем отправьте на сервер ретрансляции. Эти данные также должны содержать закрытый ключ.
5. Сервер Reway получает данные с этого сервера, считывает закрытый ключ и пересылает / передает данные любому другому клиенту с тем же закрытым ключом.
6. Когда вы получаете данные с сервера ретрансляции, которые отправил другой игрок, десериализуйте его с помощью Protobuf .
Повторяйте с # 4 до # 6, пока соединение все еще живое, и игра еще не закончена.