Intereting Posts
Что привело бы к добавлению% 5B0% 5D в URL-адрес SQLSTATE : Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов в строке 102 Переименуйте файл, если он уже существует – система загрузки php поле проверки в моем sql Лучший способ реализовать интерфейс Calendar с помощью Google Cal для событий? Разница в доступе к массивам в PHP 5.3 и 5.4 или некорректное несоответствие конфигурации? Как декодировать значения JSON в приложении Android Aplication? Использует ли PDO по умолчанию эмулированные подготовленные заявления? Как отключить параметр CURLOPT_HTTPAUTH в php? Несовместимая версия библиотеки: imagick.so требует версию 18.0.0 или новее, но libfreetype.6.dylib предоставляет версию 16.0.0 в Unknown в строке 0 Лучшие методы перенаправления? Regex, получите строковое значение между двумя символами Флажок проверки Laravel Разница между «Красноречивой моделью» и «Моделью»? Как вставить HTML в PHP DOMNode?

Как создать мой онлайн-сервер для Unity3d?

В последнее время я занимаюсь разработкой многопользовательской игры в единстве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, пока соединение все еще живое, и игра еще не закончена.