Как выбрать правильный неткод для своей игры

Почти все многопользовательские игры должны учитывать и решать проблемы, связанные с сетью, которые влияют на игровой процесс, такие как задержка, потеря пакетов и управление сценами. Игры решают эти проблемы разными способами.
Выбор правильного решения зависит от жанра вашей игры, масштаба игроков и сетевых объектов, соревновательности и других аспектов, например, от того, насколько необходим контроль над сетевым уровнем. Разные сценарии требуют разных решений для неткода.
В этом блоге мы расскажем о распространенных сетевых библиотеках, используемых в движке Unity Engine, а также о результатах исследования опыта разработчиков с этими решениями, чтобы помочь вам определить, что может подойти для вашего проекта.
Неткод - это высокоуровневый термин, который многие инженеры используют для обозначения фреймворков, специально разработанных для облегчения создания некоторых аспектов сетевого геймплея - например, синхронизации данных или компенсации задержек.
Полностью сетевая система содержит два основных компонента:
1. Транспортный (базовый) уровень, который управляет всем трафиком и пакетами, отправляемыми на/от клиента, хоста или сервера.
2. Высокоуровневый уровень абстракции, который упрощает общие потребности сетевых игр и интегрируется с инструментами
Часто под "решением для неткода" подразумевается второй уровень абстракции, поскольку именно на нем реализуется сетевой геймплей и оптимизация.
Различные решения для неткода имеют разные ограничения и возможности, которые могут упростить или усложнить создание многопользовательской игры. Важно точно знать, что именно вы хотите создать, и оценить возможные варианты до начала работы, чтобы сократить количество дорогостоящих рефакторингов.
В Unity есть два разных решения для неткода от первого лица: Netcode for GameObjects и Netcode for Entities.
Пакет Netcode for GameObjects был создан для того, чтобы помочь вам легче синхронизировать сцены и данные GameObjects на нескольких клиентах и платформах с помощью моделей с авторизацией на клиенте или сервере. Движок Unity помогает оптимизировать многопользовательские игры благодаря инструментам для профилирования сети как в режиме Play, так и во время выполнения.
Вы также можете использовать Relay от Unity Gaming Services, который является экономически эффективным одноранговым сервисом-компаньоном, для масштабирования плейтестов и создания многопользовательской игры без необходимости инвестировать в выделенный хостинг.
Расширьте спектр возможностей в грядущей версии Unity 2022 LTS. Добавьте возможность нацеливаться на соревновательные многопользовательские игры с помощью пакета Netcode for Entities на базе ECS, созданного для производительности и масштабируемости. Вы можете нацелиться на амбициозный геймплей с поддержкой серверов, предсказанием, интерполяцией и компенсацией задержек.
Снижайте затраты, используя среду сборки на выделенном сервере, которая может автоматически удалять ненужные ассеты. Развертывайте свои проекты на Game Server Hosting: этот сервис в составе Unity Gaming Services обеспечит гибкость и масштабируемость вашей игровой инфраструктуры, чтобы вы могли сосредоточиться на создании впечатлений для своих игроков.
Unity собрала отзывы о некоторых наиболее распространенных сторонних решениях для неткода, и мы создали дерево решений, чтобы помочь вам определиться с тем, какой фреймворк может подойти вам лучше всего.
Для создания этих инструментов мы собрали и проанализировали данные из трех источников:
- Опрос более 200 пользователей Unity, в ходе которого они получили информацию о своем опыте работы с конкретными фреймворками неткода
- Более 20 подробных интервью с пользователями, активно создающими многопользовательские игры на Unity
- Опыт создания прототипов с помощью MLAPI (теперь известного как Netcode for GameObjects), DarkRift 2, Mirror и Photon Quantum.
Клиенты оценили и проранжировали лучшие решения для неткода по различным осям, основываясь на своем опыте.
Сетевые технологии сложны, поэтому уровень стабильности и поддержки, которую вы получаете от своего решения для работы с сетевыми кодами, очень важен. Стабильность и поддержка каждого решения для неткода оценивалась по трем осям: вероятность появления ошибок или сбоев, время отклика для устранения проблем или помощи в отладке, а также вероятность внесения изменений в API.
Мы собрали оценки пользователей о том, насколько легко начать работу и выполнять общие задачи, включая предоставление хороших примеров, документации, учебников, а также наличие в решении простых API для создания прототипов.
Кому нужно решение с низкой производительностью? Для оценки каждого решения неткода мы искали ограниченное количество GC/аллокаций, минимальные накладные расходы на задержку, производительные вычисления и, в идеале, возможность многопоточности.
В зависимости от жанра игры, которую вы собираетесь создать, масштабируемость решения для неткода является важным моментом. Как и в случае с производительностью, мы оценивали способность решения поддерживать большее количество подключенных клиентов без значительного снижения производительности.
Наличие полнофункционального решения для работы с неткодом очень важно для поддержки любого жанра или уникальных игровых потребностей вашего проекта. При ранжировании решений мы сосредоточились на функциях среднего уровня, таких как репликация объектов и переменных, RPC, управление сценами и т. д. Мы также искали возможности более высокого уровня, такие как прогнозирование и компенсация отставания.
Для того чтобы правильно составить бюджет вашего решения для неткода, мы также включили оценку стоимости каждого решения. При этом учитывается как стоимость библиотек/решений, так и возможные скрытые расходы, например, операционные накладные расходы, которыми нужно управлять отдельно.
Прежде чем принять решение о выборе решения для неткода, важно учесть несколько моментов.
Во-первых, мы настоятельно рекомендуем вам все же провести собственную оценку. Наш обзор наиболее распространенных вариантов может оказаться полезным, но вам также следует провести оценку, исходя из специфики вашей игры.
Во-вторых, этот список основан на оценке, проведенной в 2020 году, и не представляет всех альтернативных решений для неткода или транспортного уровня, которые доступны в настоящее время.
И наконец, подумайте, какой объем дополнительной работы по обслуживанию сети вы готовы взять на себя. Нужна ли вашей игре такая большая нагрузка на сеть?
Если вы создаете что-то казуальное или кооперативное, не требующее идеальной синхронизации всех состояний игроков на разных устройствах, рассмотрите решение для неткода с меньшими накладными расходами и стоимостью разработки, например Netcode for GameObjects.
Если вы создаете игру в быстром темпе, ориентированную на экшен, где физические навыки игроков соревнуются друг с другом, обратите внимание на такое решение, как Netcode for Entities. Это может поддерживать такие вещи, как прогнозирование клиентов, и имеет метод компенсации задержки.
Приведенная ниже информация - это только начало, но мы рекомендуем вам также загрузить полный отчет по неткоду, в котором мы более подробно рассказываем об этих сторонних решениях для неткода:
- MLAPI (в настоящее время приобретен Unity и превратился в Netcode for GameObjects)
- DarkRift 2
- Фотон PUN
- Фотон Квант 2.0
- Зеркало
Примечание: В PDF-файле описаны решения, наиболее часто упоминаемые клиентами, но есть и другие. Некоторые клиенты обсуждали другие решения, для оценки которых мы еще не собрали достаточно данных, например Forge, Normcore, Bolt, LL (Enet, LiteNet и так далее). Мы советуем вам добавить их к своим соображениям, чтобы понять, подойдут ли они для вашей установки.

Независимо от того, создаете ли вы следующий боевой хит или уютную кооперативную онлайн-игру, понимание основ многопользовательских сетей и доступных вам решений неткода просто необходимо.
Посмотрите пример кооперативной игры Boss Room в Unity, чтобы увидеть пример проекта производственного качества, созданного с помощью Netcode для GameObjects. Если вы ищете пример быстро развивающейся многопользовательской игры, которая к тому же обладает сетевой производительностью, обратите внимание на образец сетевых гонок ECS от Unity, созданный с помощью системы компонентов Entities. Чтобы увидеть пример игры, которая в полной мере использует все возможности хостинга игровых серверов, ознакомьтесь с примером Battle Royale, созданным с помощью Photon Fusion.
Счастливого творчества.
Примечание редактора: Этот блог был обновлен в марте 2023 года и содержит последнюю информацию о решениях Unity для неткода, чтобы предоставить больше полезной информации для разработчиков, выбирающих правильное решение для неткода для своей игры. Данные отчета относятся к 2020 году.