Skip to content

Latest commit

 

History

History
212 lines (122 loc) · 21.2 KB

a-history-of-mirror.md

File metadata and controls

212 lines (122 loc) · 21.2 KB
description
Краткая история о том, почему Mirror существует - by vis2k

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

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

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

{% hint style="info" %} Мы будем обновлять данную статью по мере развития Mirror с течением времени. {% endhint %}

UNET

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

  • Сервер и Клиент в одном проекте. Большая часть кода является общим. Только некоторое помечено как [Server] или [Client].
    • Это позволяло значительно повысить производительность, так как клиент и сервер использовали один и тот же код.
  • [SyncVars] для автоматической сериализации выбранных переменных.
    • Это было важно если исходить из ручной сборки Serialize/Deserialize функций. Только добавь [SyncVar] на игрока. Построение уровня станет гораздо проще.
  • [Commands/Rpc] - Добавление аттрибута [Command] к функции для автоматического исполнения её на сервере стало ещё одним огромным повышением производительности
    • Конечно же, по сравнению с ручной отправкой сообщения, десериализацией всех параметров и вызовом функции вручную.

Хайп

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

Sean Riley demonstrating UNET at Unite 2014

One of the early UNET talks in 2015

Alexey Abramychev's talk about LLAPI

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

  • Алексей Абрамычев: дружелюбный русский парень, работавший над низкоуровневым транспортом (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.

UNET's movement demo with some early MMO features

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

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

Meet Damon

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

Red Baron

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

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

Что если...

The MMO Project in November 2015 with the licensed models.

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

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

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

An early version of uMMORPG

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

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

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

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

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

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

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

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

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

An early UNET community test with 57 connections and lots of bugs.

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

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

"By Design" - the UNET Bug that started Mirror

Мы построили наши мечты на 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.

{% hint style="info" %} Забавный факт: за все эти годы мы так и не разобрались, что за слон в комнате. Как получилось, что Unity внедрила эту сложную технологию UNET, но потом не смогла ее починить? Weaver - это настоящий образец инопланетной технологии, и для нас до сих пор не очевидно, кто создал эту штуку.

Копаясь в нем, в какой-то момент мы нашли код для NetworkView. Этот компонент на самом деле был частью унаследованной Unity сети Raknet. Насколько мы можем судить, UNET был основан на их устаревшей системе. {% endhint %}

Встречайте Mirror

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

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

Early Mirror stress test with hundreds of monsters

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

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

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

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

  • Через некоторое время кто-то открыл исходный код Weaver, так что мы тоже смогли это исправить.
  • Мы заменили "черный ящик" LLAPI на Telepathy. Нас сильно критиковали за использование TCP. Но, по крайней мере, "черный ящик" наконец-то был открыт, и мы смогли в кои-то веки исправить ошибки. За прошедшие годы мы добавили много других транспортных средств, таких как KCP.
  • Пол выяснил, как использовать HLAPI в качестве исходного кода без замены DLL.
  • Websockets ранее были закрыты в LLAPI, теперь они наконец-то открыты.
  • Сообщество UNET тоже перешло на Mirror.

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

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

UNET Weaver Project / DLL

Первый пример от Mirror

Первый тест сообщества HLAPI

Geno Online, jagatai's early MMO attempt with Mirror

uMMORPG 500 CCU test. UNET handled ~70 CCU when we started.

20,000 monsters in Mirror. UNET handled 12 monsters back then.

Сообщество

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

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

Population: ONE - создано с Mirror

Что дальше?

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

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

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

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

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

{% hint style="success" %} Mirror запросил 10,000+ в дополнение к UNET.
UNET был разработан за несколько лет, в дополнение к Юнитеховскому старому сетевому коду.
Устаревшие сети, должно быть, разрабатывались годами людьми, которых мы даже не знаем.

Mirror стоит на плечах гигантов.
Трудно подсчитать, сколько лет, человеко-часов, пота, слез ушло на создание этой технологии. {% endhint %}