Сетевое взаимодействие в рамках компьютерных игр является одним из самых показательных с точки зрения актуальности. В сетевом игровом приложении качество кода будет влиять показательно на работоспособность конечного продукта, так как важно достичь отправки и получения данных максимально быстро с минимумом потерь, чтобы процесс работы с приложением соответствовал современным стандартам сетевого взаимодействия.
Ключевые слова: сетевое программирование, разработка компьютерных игр, Unity.
Разработка компьютерных игр является одним из самых известных направлений в области IT. На создание видеоигры требуются специалисты разных направлений в области программирования. Сетевое программирование же, является одним из самых востребованным, в связи с постоянно набирающими популярность соревновательными сетевыми компьютерными играми, которые требуют высокий уровень точности передачи данных и низкий уровень задержки.
Чтобы рассмотреть методы сетевого взаимодействия в рамках компьютерной игры, был выбран один из самых популярных движков для разработки компьютерных игр — Unity, готовые решения для сетевого взаимодействия между клиентами использованы не будут. Сама же игра будет из себя представлять кооперативный шутер с видом сверху. Целью является полноценная синхронизация всех динамических объектов и персонажей у всех клиентов.
Сообщение между клиентами в сетевых играх обычно происходит по двум протоколам: TCP и UDP. Протокол TCP — поточная сетевая модель передачи данных, которая используется, когда требуется надежная доставка сообщений, обеспечивая гарантированную доставку с установлением соединений, т. е. без потерь, используя повторные передачи и проверки на ошибки [1]. Для обеспечения этой надежности, в жертву идет скорость передачи данных. Этот протокол в основном используется для отправки сообщений, файлов, где какие-либо потери будут критичными.
Протокол UDP же не требует предварительного соединения между клиентами, и не имеет как таковых проверок на ошибки. Он отправляет данные в виде дейтаграмм по определенному адресу, и никак не проверяет и не контролирует доставку до конечного клиента. Такой метод очень важен для скоростной передачи данных, таких как онлайн стримы, голосовые чаты и компьютерные игры, ведь потеря какой-то части пакетов не будет столь критична для конечного результата.
Именно UDP протокол и был выбран для разработки игры, ведь скорость передачи крайне важна в рамках динамичного сетевого шутера. Для реализации использованы стандартные инструменты платформы.Net — Сокеты.
Роль сервера выполняет другой клиент, который открывает сущность сервера внутри игровой сцены. Начинает передачу клиент, отправляя данные об игроке серверу. Потом, если подключение клиента подтверждено, сервер отправляет данные клиенту. Передача этих данных на сервере выполняется в разных потоках. На серверной стороне каждую итерацию fixedUpdate данные всех динамических объектов поочередно сериализуются и добавляются в лист. fixedUpdate — это частота обновления физической системы движка, что примерно равно 0.02 секунды [2], это позволит синхронизировать объекты каждый раз, когда они изменяют свое состояние, это снизит нагрузку на систему. Также сериализация данных именно в fixedUpdate требовалась в связи с особенностями работы движка Unity. Движок без каких-либо дополнительных решений не позволяет взаимодействовать с игровыми объектами, которые наследуются от MonoBehaviour в другом потоке. В новом потоке уже сериализованные данные об объектах последовательно отправляются клиенту. Это позволит ускорить отправку данных, исключив из отправки время на сериализацию (рис.1). На стороне клиента (рис. 2), сериализованные данные отправляются в лист байтовых массивов, которые расшифровываются в отдельном потоке, чтобы так же не тратить время на десериализацию во время получения данных, а расшифрованные данные применяются к игровой сцене в fixedUpdate.
Рис. 1. Сервер
Рис. 2. Клиент
Таким образом получилось реализовать полноценную синхронизацию игровых сущностей, включая анимации, рэгдолл, и прочие динамические объекты с низкой задержкой и высокой частотой обновления на движке Unity, без использования готовых решений.
Литература:
- Протокол TCP. — Текст: электронный // OpenNet: [сайт]. — URL: https://www.opennet.ru/docs/RUS/linux_base/node350.html (дата обращения: 01.03.2023).
- MonoBehaviour.FixedUpdate. — Текст: электронный // Руководство Unity: [сайт]. — URL: https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html (дата обращения: 01.03.2023).