Краткая история Mirror

Краткая история о том, почему Mirror существует - by vis2k

Наше сообщество довольно сильно выросло. многих из вас не было рядом с нами во времена начала проекта, поэтому здесь описана краткая история UNET/Mirror.

Надеюсь для вас это будет занимательное чтиво, если вы начинающий в Mirror. А возможно это будет путешествие по тропинке воспоминаний с ностальгическими скриншотами для тех, кто всё время был с нами.

Мы будем обновлять данную статью по мере развития Mirror с течением времени.

UNET

Возвращаясь в лето 2015 Unity выпустила публичную бету UNET. Идея в том, что Unity беспокоится о сетевом коде, чтобы мы могли создавать свои игры звучала довольно заманчиво. UNET поставлялся с некоторыми интересными функциями:

  • Сервер и Клиент в одном проекте. Большая часть кода является общим. Только некоторое помечено как [Server] или [Client].

    • Это позволяло значительно повысить производительность, так как клиент и сервер использовали один и тот же код.

  • [SyncVars] для автоматической сериализации выбранных переменных.

    • Это было важно если исходить из ручной сборки Serialize/Deserialize функций. Только добавь [SyncVar] на игрока. Построение уровня станет гораздо проще.

  • [Commands/Rpc] - Добавление аттрибута [Command] к функции для автоматического исполнения её на сервере стало ещё одним огромным повышением производительности

    • Конечно же, по сравнению с ручной отправкой сообщения, десериализацией всех параметров и вызовом функции вручную.

Хайп

Ещё в 2015 году, казалось, о UNET проводились обсуждения и выпускались видеоролики на тему Демократизации Многопользовательской Разработки. Все были взволнованы, а команда UNET усердно работала.

Тогда, это были в основном:

  • Алексей Абрамычев: дружелюбный русский парень, работавший над низкоуровневым транспортом (LLAPI)

  • Sean Riley: кто работал над World of Warcraft, сейчас разрабатывает высокоуровневый API (HLAPI/UNET)

  • Erik Juhl: тимлид UNET, кто сказал что MMO были его страстью

У команды UNET были большие планы судя по их roadmap'у:

  • Облачные сервисы для Ретрансляции/Matchmaking

  • Размещение игрового сервера в один клик прямо из редактора Unity

  • Сервер моделирования который будет обеспечивать работу сети масштаба MMO

  • UNET '3 фазы' также известные как автоматизированные серверные экземпляры. Отметьте область, она будет запущена как экземпляр.

Большинство многопользовательских игр никогда не увидят свет, потому что доработать весь этот код чрезвычайно сложно. С UNET это впервые показалось действительно выполнимым. Наверняка производительность повысилась на порядок.

Приступая к работе

В 2015 году UNET всё ещё находился на стадии Бета-тестирования. Документации было не много, да и имелось всего пару демонстраций. Одна из них это была демонстрация передвижения парочки шаров по сети.

Я уже работал над своим ММО проектом до UNET. Движущиеся шары отсылали меня к мысли о передвижении игроков, поэтому я решил попробовать UNET.

Сетевое NavMeshAgent перемещение, умения, подбор предметов и инвентарь были легко добавлены благодаря SyncLists и остальными удобными [SyncVar]/[Rpc].

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

Meet Damon

Примерно в сентябре я также начал разговаривать с Деймоном Слаем, парнем, который в 1990 году снял "Красного барона", изданный издательством Sierra.

Деймон и его новая команда "Mad Otter Games" фактически создали свою собственную инди-ММО, как я и планировал сделать. Они не использовали Unity, но рассматривали его для своего следующего проекта. Мы много говорили о технологиях ММО, извлеченных уроках, и они даже выдали мне лицензию на пару своих моделей для моего неназванного ММО-проекта.

С командой UNET, неустанно работающей над созданием сетей, и ребятами из MadOtter в качестве живого доказательства, казалось, что моя идея инди-ММО на этот раз действительно казалась почти выполнимой.

Что если...

В 2015 году, насколько я мог судить, не было доступно ни одного MMO-инструментария. Со времен моего реверс-инжиниринга я помнил, как Perfect World Entertainment лицензировала их движок для MMO за $100,000 - $300,000. Что, само собой разумеется, выходило за рамки моего бюджета.

Поскольку я все равно работал над своим собственным MMO проектом, я подумал что мог бы разместить его на Asset Store и посмотреть что случится. Может быть это будет приносить $50/в месяц и я смогу покупать себе пиццу каждую неделю.

uMMORPG был выпущен в Asset Store 23-го декабря 2015 года. В день перед Рождеством.

Как оказалось, у многих людей была такая же мечта, но не хватало денег, чтобы лицензировать движок AAA.

uMMORPG быстро вышла в топ 10 товаров на Assets Store.

Еще вчера разработка MMO была моим хобби, мечтой поработать в свободное время. За ночь это превратилось в работу на полный рабочий день, благодаря движку Unity, UNET и огромной ставке.

В UNET, которому мы доверяли

Примерно в то же время наши пути с Полом пересеклись, когда он использовал uMMORPG для своей игры Cubica.

Была только одна проблема: UNET. Мы полностью доверяли сетевому черному ящику и паре профессиональных сетевых инженеров.

Тем не менее, даже после 30-50 сообщений об ошибках и 1-2 лет упрашиваний каждого отдельного человека в команде UNET - ничего не произошло. Не было исправлено ни одной ошибки. Никаких улучшений. Никаких ответов.

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

Хуже всего, что UNET не масштабировался. 30-70 CCU и дюжина монстров это всё что он мог выдержать.

В какой-то момент я использовал рефлексию, чтобы исправить ошибку сериализации в UNET. В то время это была сетевая ошибка с самым высоким рейтингом в системе отслеживания проблем Unity. Я сделал подробные сообщения на форуме о том, почему возникает ошибка и как ее исправить. Я связался с Алексеем, Эриком, Ларусом, командой Asset Store и QA.

Это специально было закрыто. Дважды.

Мы построили наши мечты на UNET, а я в своём случае на выживание. Мне нужен был UNET чтобы оплачивать квартиру и есть. И все же люди, которым мы полностью доверяли, покинули нас.

  • Шон Райли был движущей силой UNET. Как оказалось, он покинул команду во время бета-тестирования.

  • Алексей старался заполнить образовавшуюся пустоту как можно лучше. Какое-то время он был на форуме по воскресеньям и даже ответил на мое электронное письмо во время своего отпуска. Однако в какой-то момент он тоже покинул Unity.

  • Эрик Юл (руководитель команды UNET) перешел на работу в компанию по веб-разработке.

Хуже всего то, что, хотя все тайно покинули тонущий корабль, от Unity не было ни слова. Мертвая тишина. Нам потребовалось пару лет, чтобы узнать, что основная команда UNET больше даже не работает в Unity.

В какой-то момент мы даже написали открытое письмо Йоахиму Анте. Отчаянные времена.

HLAPI Pro

Внезапно в один момент кто-то из Unity выложил HLAPI с открытым исходным кодом - высокоуровневую часть UNET.

LLAPI - низкоуровневый транспорт - всегда оставался с закрытым исходным кодом.

Для HLAPI нужно было скомпилировать две библиотеки DLL csharp, вручную перезаписать их при установке Unity, а затем молиться, чтобы они были совместимы с этой конкретной версией Unity.

Код был раскомментирован, чрезмерно переработан, полон ошибок и полон волшебства.

Но у нас был источник. Наконец-то забрезжил свет в конце туннеля.

Итак, я сделал этот пост на форуме о "HLAPI Pro - отличная замена UNET". Полностью совместим, только с парой исправлений ошибок, для которых мне ранее приходилось использовать reflection. Идея состояла в том, чтобы предложить людям 100% безрисковую альтернативу. Используйте HLAPI Pro, чтобы исправить свои ошибки. Возвращайтесь к исходным библиотекам DLL в любое время.

Насколько я помню, сначала Пол действительно работал над MLAPI с TwoTen. Но он убедил меня лицензировать HLAPI Pro в MIT, и так появилось Mirror.

Забавный факт: за все эти годы мы так и не разобрались, что за слон в комнате. Как получилось, что Unity внедрила эту сложную технологию UNET, но потом не смогла ее починить? Weaver - это настоящий образец инопланетной технологии, и для нас до сих пор не очевидно, кто создал эту штуку. Копаясь в нем, в какой-то момент мы нашли код для NetworkView. Этот компонент на самом деле был частью унаследованной Unity сети Raknet. Насколько мы можем судить, UNET был основан на их устаревшей системе.

Встречайте Mirror

В течение следующих двух лет мы исправили несколько сотен ошибок UNET и сделали код чище.

И все же никто не верил в UNET. Предположительно, его архитектура не имела смысла, он никогда не масштабировался и никогда не сработал бы ни для одной реальной игры. Единственными людьми, которые поверили в Mirror, были те, кто уже использовал UNET для своих проектов, отчаянно нуждаясь в исправлении ошибок.

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

Наши сетевые герои бросили нас и сказали, что наша работа бессмысленна.

Разрывая цепи

Шаг за шагом мы разорвали все цепи, которые все еще связывали нас с UNET.

  • Через некоторое время кто-то открыл исходный код Weaver, так что мы тоже смогли это исправить.

  • Мы заменили "черный ящик" LLAPI на Telepathy. Нас сильно критиковали за использование TCP. Но, по крайней мере, "черный ящик" наконец-то был открыт, и мы смогли в кои-то веки исправить ошибки. За прошедшие годы мы добавили много других транспортных средств, таких как KCP.

  • Пол выяснил, как использовать HLAPI в качестве исходного кода без замены DLL.

  • Websockets ранее были закрыты в LLAPI, теперь они наконец-то открыты.

  • Сообщество UNET тоже перешло на Mirror.

До сегодняшнего дня большая часть нашей работы над Mirror заключалась в том, чтобы разорвать цепи и исправить все баги.

Вот несколько скриншотов, которые мы собрали за эти годы. Наслаждайтесь ностальгией.

Сообщество

Прошло 6 лет с момента бета-тестирования UNET. Mirror вырос до 100 000 загрузок в год, фантастическое сообщество Discord с 10 000 пользователями, новые члены команды, такие как наша знаменитая сетевая легенда MrGadget, Coburn, James, katori, Lymdum, uwee и многие другие.

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

Что дальше?

Мы потратили все это время на то, чтобы разорвать цепи и исправить баги. Сотни из них.

Но с тех пор мы также многое узнали о нетворкинге.

В будущем, наш roadmap будет больше касаться не сколько багов, сколько новых сетевых технологий.

Несмотря на стабильность, Mirror еще предстоит пройти долгий путь, и первоначальная миссия никогда не менялась.

Нам это просто нужно для наших игр.

Mirror запросил 10,000+ в дополнение к UNET. UNET был разработан за несколько лет, в дополнение к Юнитеховскому старому сетевому коду. Устаревшие сети, должно быть, разрабатывались годами людьми, которых мы даже не знаем. Mirror стоит на плечах гигантов. Трудно подсчитать, сколько лет, человеко-часов, пота, слез ушло на создание этой технологии.

Last updated