Облачно, местами даже чересчур

Мимо белого яблока луны,
Мимо красного яблока заката,
Облака из неведомой страны,
К нам спешат и опять бегут куда-то.

"Облака, белогривые лошадки"

Профдеформация - страшная штука. Перефразируя известный афоризм, поработав пару лет молотком, станешь на всё смотреть в первую очередь с "гвоздевой" стороны. А уж что у патологоанатомов творится...

Айтишники, и в частности системные администраторы, к которым принадлежу и я - вовсе не исключение из этого правила. Добавьте сюда любовь к ММО, щедро окрашивающую мысли на эту тему экспрессией - и получите довольно взрывоопасную смесь. Иначе говоря, когда я слышу или вижу, как некто, говоря об ММО, напускает туману, использует обтекаемые формулировки или просто несёт чушь - в голове сразу же возникает здоровенный индикатор "не взлетит". Почему конкретно не взлетит - индивидуально, но чаще всего из-за таких приземлённых вещей, как физические законы и текущий уровень развития цивилизации. Вдвойне неприятно, когда такие вещи говорит уважаемый человек, пусть даже совершенно искренне.

Итак, встречайте - Раф Костер, мастодонт индустрии, Ультима, конец прошлого века, вот это всё...

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

Раф говорит об облаках, старых мейнфреймах и играх без клиентских частей. Говорит связно, остроумно, но... совершенно оторванно от реальности. За всё хорошее против всего плохого. Никакой технической конкретики - что легко можно было бы простить геймдизайнеру в вакууме, но не человеку, стаж которого перевалил за четверть века.

На самом деле, спускать всех собак на одинокого (в рамках нашего заочного противостояния) господина Костера совсем не хочется, потому что проблема, на мой взгляд, лежащая "унутре" подобных размышлений, системная - и охватывает намного больше, чем умы дизайнеров ММО.

Но давайте по порядку. Раф начинает с предложения взглянуть фактам в лицо и согласиться, что "облака не являются чем-то новым". В этот момент ваш покорный слуга совершит изящный неожиданный пируэт - и согласится без каких-либо оговорок. Да, облака давно и прочно вошли в нашу жизнь, спорить с этим бесполезно. Для читателей без айтишного бэкграунда напомню, что облако в современной индустрии - это логическая прослойка между владельцами вычислительных мощностей (серверов, сетевых устройств, систем хранения) и желающими этими мощностями воспользоваться. Если хотите - следующий эволюционный шаг виртуальных машин, позволяющих на одном физическом устройстве размещать несколько разделённых между собой сервисов.

Важно помнить следующее: облака - это просто чьи-то компьютеры.

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

"Вы что, и пироги за меня есть будете?" - "Ага!"

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

Платите только за то, чем реально пользуетесь - и ни рублём больше. Никаких капитальных вложений, никакой амортизации и бумажной волокиты в бухгалтерии. Раз в месяц на почту приходит счёт, оплачивается - и ещё на месяц можно забыть про организационные заморочки.

Видите - даже мне, увернувшемуся от пленительного очарования облаков, не составило труда рассказать о их несомненных достоинствах по сравнению с традиционными схемами. Что уж говорить о сладкоязыких продажниках многочисленных компаний, приглашающих в свои облачные сети?

Звучит вполне утопически, не правда ли?

Вам больше не нужен сисадмин-железячник, сисадмин-сетевик, уходят 80% инструкций для дежурной смены - куда бежать и что делать в случае дизастера... И, исходя из этого - получается, что вам, на первый взгляд, больше вообще не нужен полноценный сисадмин. Индустрия бодро отреагировала на это появлением методологии DevOps и, соответственно, DevOps-инженеров - работников, занимающихся не только эксплуатацией, но и в некоторой степени влезающих в тестирование, разработку, с уклоном в CI. Все айтишные ресурсы регулярно пополняются рекламными материалами а-ля "Интенсив-курс, сделающий из вас девопса всего за неделю". Действительно, раз всё теперь в облаках - то зачем нужен традиционный (жест пальцами, обозначающий кавычки) админ-бездельник, который большую часть рабочего времени поплёвывает в потолок, потому что у него всё работает, как часы?

Вполне вероятно, что вы, наученные горьким опытом чтения моих текстов, уже почувствовали подвох. Да, подвох имеется - но разглядеть его, как пятнистого ягуара под узорчатой лесной тенью, не так-то просто. Совершу ещё одно неожиданное па де ша и скажу так:

Облака - реально крутые и полезные*.

*В подавляющем большинстве случаев.

Подвохов, на самом деле, несколько, но начну я с наполовину философского заявления, что "ММО - это совершенно особый вид программного обеспечения". И именно исходя из этой "особенности" проистекают нюансы, зачастую плохо совместимые с облаками.

Так уж повелось, что практически всё, наблюдаемое нами через монитор в интернете, имеет асинхронную суть. Говоря проще - любой ресурс, будь то поисковик, мессенджер, сайт банка или сервис потокового видео вроде Ютуба, работает по принципу "запрос - ответ", причём время ответа никто гарантировать не может. Вы скажете - "как же так? мы ведь общаемся голосом через Дискорд и устраиваем видеоконференции через Зум - и всё работает отлично!". Вы скажете - и будете правы, по крайней мере до того, как мы залезем "под капот". Когда-то давно я уже рассказывал, "как всё это вообще работает", и предпочту не повторять те элементарные вещи, сосредоточившись в этот раз на другом.

Да, видеостриминг и передача голоса по UDP неплохо работает - но вспомните, какое количество участников мы имеем в виду? Единицы, десятки. Да и, кроме того, тупая отправка данных между разными точками интернета - совсем не ресурсоёмкий (помимо трафика) процесс. Сервер просто принимает данные, смотрит на них - и отправляет другим людям.

Чем же в таком контексте отличается ММО, спросите вы?

Начать придётся немного издалека. В информатике существует такое понятие, как вычислительная сложность. Предельно упростив определение, можно сказать, что это оценка, насколько сложен алгоритм и как он себя ведёт при увеличении количества входных данных. Бывают алгоритмы, весьма толерантные к увеличению объёма информации, другие - не очень. Но независимо от этого, понятное дело, чем больше данных - тем сложнее и дольше будет их обработать.

Ещё одна небольшая ремарка, призванная настроить вас на нужный лад - на этот раз из нежно любимой мною небесной механики. Знаете ли вы, что человечество, несмотря на несомненные успехи в науке, до сих пор не способно решить задачку, на первый взгляд совершенно элементарную - "как между собой взаимодействуют три тела"? Три астероида, вращающиеся рядом друг с другом в глубоком космосе. Или три яблока. Или три чайника. Я немного сгустил краски, честно говоря - иначе как бы космические корабли смогли бороздить просторы большого театра? Но сгустил совсем немного - потому что человечество, вполне в соответствии со своей природой, слегка схитрило и отказалось от точного решения задачки, удовольствовавшись приблизительным. Для текущих нужд этого вполне достаточно - но точного общего решения задачи трёх тел, не говоря уж о произвольном количестве тел, да, не существует.

Возвращаясь к ММО, вполне уместно сказать, что "количество тел" у нас гораздо больше, чем три. И алгоритм (или совокупность алгоритмов), относящийся к каждому игроку, в общих чертах состоит из таких слагаемых:

  1. Воздействия персонажа на мир (срубили дерево, сорвали цветочек - это нужно отразить в базе данных и мочь показать другим, запустить таймер респауна)
  2. Воздействия мира на персонажа (наступили в лужу - получили дебафф, упали со скалы - получили урон)
  3. Воздействия персонажа на NPC и обратно (битвы с мобами, получение квестов, торговля и т. д.)
  4. Воздействия персонажа на других персонажей (синхронизация относительного расположения, механика попаданий в ближнем бою, LoS с физикой снарядов и т. д.)

Раф Костер приводит отличный пример, насколько в одиночных играх взаимодействия между сущностями богаче, рассказывая про напившегося и обблевавшего, простите, всю таверну кота в Dwarf Fortress. Хе-хе, видел бы он моих куриц-циррозников и прочую крутоту в RimWorld...

Да, в одиночных играх, действительно, часто есть такие вещи, до которых ММО ещё ползти и ползти. У меня тоже есть парочка примеров, не уступающих, на мой взгляд, рафовским:

Что объединяет все эти игры? Да тот самый факт, что в них, даже при наличии многопользовательского режима, не происходит взаимодействия между большим числом активных объектов. Да, для каждого персонажа приходится расчитывать некоторое количество величин, в фоновом режиме пробегаться по всем клеточкам мира и изменять их параметры в соответствии с "как бы физическими законами". Но на этом всё.

А что же в ММО? Представим себе тот самый "сложный живой мир", про который говорит Раф, и вполне стандарную ситуацию - когда одна группа игроков нападает, а другая, скажем, защищает некий форпост. У нас есть такие параметры живого мира, как гравитация, полностью разрушаемое окружение, температура, физика жидкостей и газов - самый костяк, без излишеств.

Нападающие швыряют фаерболл в бревенчатую стену - пока он летит, надо подсчитать, как сильно он нагревает окружающий воздух, насколько сильные искажения видимости появятся вокруг него. Вот фаерболл долетел до ограды, врезался в неё и взорвался - считаем, какой урон получило брёвно, силу разгоревшегося пламени, температуру всего вокруг... ах да, не забываем про искры, разлетевшиеся во все стороны - подожгут ли они то, куда упали, или просто потухнут? Огонь постепенно распространяется по дереву, и вот одно из брёвен достаточно прогорает, чтобы его основание перестало выдерживать такой вес, и с треском падает вниз - начинаем подсчитывать, что произойдёт с огнём, вторичные эффекты в виде горящей травы и обуглившейся почвы, деформацию рельефа от падения. Защитники наконец преодолевают панику - и их геомант кастует заклинание "призыв дождя". Потоки воды низвергаются из небольшой тучки на пожар, попутно охлаждая и увлажняя всё вокруг - огонь потухает, обнажая обуглившиеся брёвна, жидкость шипит и испаряется, образуя пар и туман, земля в зоне действия размокает, превращаясь в грязь.

Звучит внушительно, но, согласитесь - совсем не чрезмерно для подсчёта на современных серверных процессорах? Да, так и есть, но вот в чём загвоздка - я описал только одно-единственное взамодействие двух персонажей, каждый из которых совершил ровно одно действие. А сколько таких действий происходит одновременно в замесе? Десять? Сто? Более того - отдельные взаимодействия далеко не всегда изолированы друг от друга и могут привносить своё влияние к "соседям", образуя систему со всё большим числом переменных (совсем как в той задачке про астероиды, помните?).

Окей, у нас, как это модно сейчас говорить, "cloud-native application", и целая когорта серверов готова перемалывать тонны данных, только попроси. Но тут мы сталкиваемся с такой штукой, как "(не)локальность вычислений". Это про то, сколько занимает обработка и обмен информацией между двумя узлами. Предположим (это довольно реалистичный сценарий), что в нашем облаке есть отдельный сервер для обработки каждого типа взаимодействия - пламени, образования пара, ударов молнии... и (чего мелочиться?) - по отдельному серверу для каждого персонажа в онлайне. Каждый такой "личный сервер" получает данные с компьютера игрока, обрабатывает их и отправляет, в зависимости от того, что сделал персонаж, соответствующему "серверу стихии".

Введём допущение (также вполне реалистичное), что временем обработки "внутри" серверов можно пренебречь. Почему - вы можете увидеть на картинке сверху (кстати, очень полезной и давно обитающей у меня в закладках браузера), сравнив среднее время обработки процессором команд, исчисляемых чёрными квадратиками, с отправкой данных другому серверу по сети, обитающему в нижней половине зелёной четверти.

Присмотревшись к системным единицам и прикинув в уме, кажется, что эти сотни микросекунд ничего не значат в контексте взаимодействия с живым игроком, скорость реакции которого на три порядка ниже. Это распространённое заблуждение, но опровергается оно очень просто - достаточно просто вспомнить, чем отличается производительность от пропускной способности.

Облака могут быть оснащены сколь угодно передовыми серверами, обвешанными гигагерцами и быстрейшей оперативной памятью с новейшими NVM-дисками, но... если на определённом этапе для продолжения работы системы ему придётся отправить данные по сети на другую физическую машину - то всё, от производительности ничего не останется, как от широчайшего автобана с натыканными каждые двести метров светофорами. 99% времени наши великолепные серверы будут ждать новую порцию данных.

Знаете, чем очень часто занимаются проектировщики процессоров и материнских плат? Пытаются как можно сильнее сократить длину дорожек! Именно потому, что каждая лишняя доля миллиметра - это потерянные наносекунды. А тут мы (глубоко вдохните и наберитесь терпения) берём данные из процессора, отправляем их в сетевую карту, она (в лучшем случае) преобразует перепады напряжения в фотоны, засовывает их в оптоволокно, отправляет к оптическому коммутатору, тот принимает фотоны, превращает опять в электричество, смотрит на получившиеся биты, превращает обратно в фотоны, засовывает в нужный порт, они прилетают на сетевую карту сервера-получателя, превращаются ещё раз в электричество... и только потом доезжают до приложения, которое за пренебрежимо малое по сравнению с предыдущими страданиями время что-то делает.

Получив наконец-то запрос от первого сервера, второй, обработав его, в свою очередь, тоже куда-то отправляет данные. И ещё раз. И ещё. А потом - обратно игроку через полмира (это уже последняя, красная четверть картинки с квадратиками).

Сколько таких итераций может произойти? Напрямую зависит от количества участвующих сущностей.

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

И получается такая штука, что создать живой мир, в котором реалистично растут деревья, персистентно меняется рельеф, обитают обладающие гибким поведением мобы и очень похожие на живых людей NPC - можно. А вот как следует реализовать их взаимодействие с пачкой игроков - под вопросом. Именно отсюда и проистекают разного рода упрощения, иногда принимая довольно уродливые формы - от возникающих из воздуха цветочков с рудными жилами до неразрушимого ландшафта и бездонных карманов NPC-торговцев.

Говоря популярно - некоторые процессы просто очень плохо масштабируются. Бывает такое, что процессы плохо масштабируются даже на несколько ядер одного и того же физического процессора - что уж говорить об обмене данных с другими устройствами? Именно отсюда, на мой взгляд, а вовсе не из-за какой-то недальновидности или злого умысла, проистекает традиционная (жест пальцами, обозначающий кавычки) структура ММО-проекта, с небольшим количеством мощных серверов, располагающихся максимально близко друг к другу и так называемое "шардирование".

Исходя из этого, можно сказать, что особенность ММО как программного обеспечения напрямую проистекает из происходящего внутри виртуального мира - много активно взаимодействующих сущностей, экспоненциально возрастающая при увеличении количества действующих лиц сложность вычисления происходящего, и, вдобавок, увеличивающаяся требовательность к времени обработки и отклика во время таких событий - если слегка притормаживающая реакция какого-нибудь моба в дремучем лесу может быть совсем не заметна, то при PvP-замесе та же половина или треть секунды, предваряющая каждый взмах меча и телепортирующиеся в пространстве противники могут очень быстро отвадить даже самых преданных фанатов (разве что кроме игроков в EVE).

Кстати, о телепортирующихся противниках - на этой фразе мы можем изящно перейти к следующей, мягко выражаясь, спорной вещи, транслируемой Рафом в своём выступлении. Он говорит про то, как круто было бы иметь возможность попадать в виртуальный мир откуда угодно, про Flash (земля ему пухом, и слава богу), про браузерные игры и про то, что точка вхождения в ММО - "это просто окно".

Ох, как красиво это звучит. Если бы только мы жили в таком мире, где единорожеки летают под облаками, за ними простираются радуги, а игры способны работать с приемлемой производительностью на любом устройстве... Раф говорит об универсальных графических движках, загружаемых в браузерах, которым всё равно - что там у вас за игра и про то, что он готов пожертвовать красивостью графики ради кроссплатформенности. Ох, если бы проблема была в графике, Раф...

Я уже говорил когда-то, что "толстые клиенты", на засилие которых так активно сетует Раф, появились не просто так, а в качестве отчаянного шага, призванного увеличить играбельность хотя бы до приемлемого уровня. Вкратце - ненавистный толстый клиент нужен для того, чтобы вы не ждали ту самую (смотрим на картинку с квадратиками) долю секунды прежде, чем на экране отобразится результат вашего нажатия на кнопку. Толстый клиент, несмотря на своё не вполне благозвучное название, регулирует весьма тонкие материи, позволяющие нормально работать любой real-time онлайн-игре, не превращая её в пошаговую. Законы физики неумолимы, а попытки их неизящно обхитрить приводят в результате лишь к многочисленным смешным видео на Ютубе.

Помимо хитростей с отображением на экране, толстый клиент решает ещё одну очень важную проблему - максимально производительное взаимодействие с устройствами компьютера. Между собственно "железом" - процессором, памятью, видеокартой, и приложением, желающим ими воспользоваться существует и так достаточное количество слоёв абстракций, каждый из которых хоть немного, но уменьшает производительность. Исполнение кода внутри браузера в этом плане - сущая катастрофа, как и упомянутый Рафом Flash, который грузил процессор не хуже какого-нибудь вируса-майнера. И критичность этого не зависит линейно от "красивости картинки", отнюдь нет - тормозить всё будет даже с минимальной не вызывающей отвращения графикой.

С другой стороны - специалисты вроде Джона Кармака, наверное, обладают неким сакральным знанием - раз для новых игр раз за разом пилят свои собственные движки, работающие максимально "в обнимку" с видеокартой - и поэтому выдающие трёхзначный FPS даже в самых сложных для обсчёта сценах (посмотрите хотя бы на последний Дум - это же натуральная феерия и отвал башки).

Подытоживая сказанное и желая закончить на мажорной ноте, имею заявить следующее:

Я, в полном согласии с Рафом, вовсе не отрицаю необходимости тектонического сдвига в ММО - в сторону уменьшения детерминированности виртуальных миров, наполнения их жизнью и превращения в нечто самостоятельное из "ярко раскрашенных декораций". Более того, я уверен, что скорее рано, чем поздно (будем оптимистичны) это произойдёт - и всё станет отлично. Но только не сегодня. И не завтра.

Само наличие такой технологии, как "вычислительные облака" - никакая не серебряная пуля, а просто инструмент, удобный в одних случаях, но противопоказанный в других. И я уверен, что создание такого, персистентного и живого мира - очень сложная математическая задачка, решить которую по силам только лучшим программистам, а вовсе не "забрасыванием потребностей всё более производительным железом".

Относительно же судьбы клиентской части ММО - я думаю, что толстые клиенты не только никуда не денутся, но и, вполне возможно, дополнятся специализированным железом для (чем чёрт не шутит) VRMMO и прочих высокотехнологичных штук. И это отлично - потому что не нужно нам никаких "окон в ММО" из мобильных телефонов, планшетов и умных колонок :)