Ignorance

https://github.com/SoftwareGuy/Ignorance

Что такое Ignorance?

Ignorance это надежный UDP транспортный уровень, использующий собственную сеть ENET C Networking library как custom fork of ENet-CSharp обеспечивающий надежный и ненадежный последовательный UDP-транспорт для 64-разрядных настольных операционных систем (Windows, Mac OS and Linux) and Mobile OSes (Apple iOS and Android). Он поддерживает 255 каналов и 4096 клиентов подключенных в одно время.

ENET - это надежная сетевая библиотека UDP C++, которая является зрелой и стабильной. LLAPI Unity нуждался в замене. Ignorance был разработан с учетом этой цели - заполнить пробелы и обеспечить надежную и производительную передачу UDP для Mirror.

Почему Ignorance вместо Unity LLAPI?

Старый LLAPI Unity был ужасно неэффективен, и множество тестов показали, что вы получите снижение производительности, используя Unity LLAPI в своем проекте. Это связано с архитектурой старого сетевого кода - технология Unity принимала решения "по архитектуре" и допускала некачественные исправления ошибок, которые другие разработчики воспринимали как пластырь на зияющую рану. Они не заботились о производительности или исправлениях ошибок.

Unity LLAPI также был с закрытым исходным кодом, что означало, что разработчики Mirror не могли взяться за дело и сделать его лучше.

Кто разработчики Ignorance?

Coburn является ведущим разработчиком транспорта. Oiran Studio активно использует этот транспорт для сетевых игровых проектов. В настоящее время он также используется некоторыми игровыми проектами, которые вы можете найти на сервере Discord по Mirror.

Почему я должен использовать надежный UDP вместо TCP?

  • если у вас есть связь в режиме реального времени, вам нужна скорость, а не надежность (VoIP...)

  • если вам нужны каналы

  • если вам нужны пользовательские типы отправки по каналам

  • если вам нужен канал передачи данных для вашей игры (a first person shooter, racing game, etc)

Почему я не должен использовать UDP вместо TCP?

  • если у вас есть критически важные вещи (если вам НУЖНО чтобы данные отправлялись точно из точки А в точку Б, без исключений)

  • если вам нужен полностью надежный сетевой протокол

  • если у вас паранойя

  • если вы создаете игру, похожую на Minecraft, и вам нужно, чтобы все были синхронизированы

Я хочу узнать больше о надежном UDP...

Требуется небольшое объяснение. UDP лучше всего описать как протокол передачи данных "shattershot", который означает, что вы просто распыляете пакеты и молитесь, чтобы они достигли места назначения, и надеетесь на лучшее. Удаленный адресат может получать, а может и не получать эти пакеты, и они не будут в порядке. Например, если у вас есть поток пакетов, который выглядит как:

1 2 3 4 5 6 7

...тогда это может прийти в не лучшем виде из-за того, что пакеты поступают не по порядку. Точка в следующем примере означает, что пакет пропал без вести.

7 6 1 3 2 4 5
7 6 . . 4 . 1
. . . . 1 2 3
1 2 3 5 4 6 7

Например, предположим, что вы потеряли пакет, содержащий обновление о состоянии здоровья игрока. Все остальные могут знать, что они получили 69 единиц урона, но у этого клиента все равно будет прежнее значение, скажем, 72 единицы здоровья. Без надежного UDP вы можете очень быстро выйти из синхронизации. Когда вы потеряете синхронизацию, игра закончится - все начнет работать очень странно.

Последовательность и надежная доставка

Последовательность

Надежный режим просто сообщает СЕТИ отправить это сообщение, ожидая, пока пульт подтвердит прием пакета, прежде чем заявить, что он был "потерян". ENET по-прежнему будет классифицировать указанные пакеты как потерянные, если не получит ответа от удаленного устройства, но будет повторно передавать их, чтобы компенсировать соединения с потерями или ситуации с высокой задержкой. Надежный режим пытается эмулировать некоторую повторную отправку TCP, если она не подтверждена вовремя, но поскольку UDP не обладает всеми служебными данными, которые есть у протокола TCP, это добавляет некоторую служебную информацию о пакетах.

По умолчанию Ignorance поставляется с двумя каналами как в надежном, так и в ненадежном режиме. Существуют и другие режимы канала, которые разработчики могут протестировать, поскольку разные из них могут подходить для разных нагрузок, но обычному человеку не нужно беспокоиться об этом. Ignorance приходит с разумными настройками по умолчанию из коробки.

Поддерживает ли Ignorance Websockets?

Нет, не поддерживает. Mirror поставляется со встроенной поддержкой websockets.

Где я могу найти Ignorance?

Возьмите Ignorance со странички релизов в репозитории на Github. Просто импортируйте UnityPackage из загруженного вами выпуска.

Где я могу поддержку Ignorance?

Вы можете обратиться в службу поддержки, открыв заявку на Ignorance repository issue tracker или в канале #ignorance в Mirror Discord сервере.

Я до сих пор не понимаю, что это за транспорт, у меня голова идет кругом, помогите!

Заходите в Discord, и мы сделаем все возможное, чтобы объяснить это простым английским языком.

Last updated