Вкратце о Джите
С давних времён Джита является самой густонаселённой планетной системой нашего общего мира — своего рода «галактическим гипермаркетом», образовавшимся естественным путём. Неизбежность появления такой системы очевидна (не забывайте о присущей каждому человеку потребности в общении и обмене); то, что выбор пал на Джиту, объясняется её уникальным положением на карте галактики.
За прошедшие годы Джита приобрела неоднозначную репутацию «гнезда порока, лжи и обмана» / «отличного примера успешности концепции эмергентной игровой вселенной» / «главной шестерни двигателя галактической экономики» / «лучшего места для проведения выступлений разгневанных вкладчиков».
А в эту пятницу она взяла и загорелась.
Само собой разумеется, загорелась не сама Джита, а тысячи кораблей игроков, до сих пор считавших её «тихой гаванью», приютом и убежищем для торговцев. Горело всё, что может летать — от маленьких грузовиков до огромных тяжелобронированных фрейтеров, трюмы которых были забиты товарами на многие тысячи долларов США.
На приведённой ниже карте каждая точка соответствует одной из планетных систем Нового Эдема (всего их на карте пять тысяч четыреста тридцать одна). Чем ближе цвет точки к красному цвету, тем больше в этой системе погибло кораблей — и, как можно видеть, Джита очень сильно выделяется на фоне остальной галактики.
Произошло это лишь потому, что несколько игроков очень захотели претворить свои планы в жизнь; они сумели убедить в своей правоте несколько тысяч пилотов и сделали слово делом.
«Пожар в Джите»
На подготовку операции в Джите ушло несколько месяцев, причём велась она силами многотысячного альянса, вознамерившегося нарушить нормальный ход работы самого большого торгового хаба в Новом Эдеме — потрясти основы экономики «Евы», вонзить в её сердце острый кинжал и тем самым кардинально изменить жизнь всей галактики. Не следует забывать о том, что эта операция преследовала ряд неигровых, надэкономических целей, суливших организаторами невероятные выгоды. Детали налёта на Джиту обсуждались как внутри игры, так и за её пределами — по голосовой интернет-связи, на секретных форумах, в твиттере; одним словом, писался настоящий научно-фантастический роман из жизни информационной цивилизации — фантазия тут явно пасует перед реальностью.
Идеально работающий механизм переброски боевых сил позволил коалиции, ведомой альянсом «Гунсворм» (Goonswarm), собрать в Джите невероятное количество кораблей и пилотов — скорее всего, приложенные игроками усилия заставили бы позавидовать им даже стратегов из настоящих министерств обороны. Всё это было густо приправлено соусом из невероятно громкой пропаганды; впрочем, и здесь «Гунсворм» не слишком далеко ушёл от земных реалий.
Итак, наступила пятница: целые флоты, оснащённые всём необходимым для максимального увеличения массы первого залпа, начали вести координированный огонь по дорогостоящим грузовым кораблям, методично уничтожая их. Нападающие практически сразу гибли под ответным огнём полицейских патрулей — но жертвы эти были отнюдь не напрасными.
Посреди рукотворного хаоса сновали те, кто решил половить рыбку в мутной воде (в надежде выловить что-нибудь стоящее); они мгновенно обгладывали остовы погибших кораблей, причём происходило это на глазах у всего сообщества игроков. «Пожар» освещался в блогах и на форумах, в интернет выкладывались ролики и скриншоты; кто-то вёл прямую трансляцию, кто-то радовался, кто-то — клял «поджигателей» последними словами. Некоторые пилоты даже попытались организовать сопротивление, однако особых успехов им добиться не удалось.
Всё это в полной мере соответствовало нашей концепции, основывающейся на неограниченной свободе действий, совершаемых игроками в едином, общем для всех пилотов мире — как метко выразился наш главный продюсер, «всё это было нев#####но прекрасно». Игроки в полной мере разделяют эту точку зрения: «есть что-то особенное в постройке 15 000 кораблей, каждый из которых рассчитан лишь на один залп, производящийся на глазах у вооруженной полиции».
Разработчики (то есть мы) были в полном восторге от того, что игроки вознамерились устроить в созданной нами вселенной. Увы, покупкой попкорна и удобных кресел наши заботы не ограничились; нам предстояло проделать немало работы...
Техническая сторона вопроса
Поскольку «Пожар в Джите» был анонсирован его устроителями с большим запасом по времени (а мы поддерживаем всё, что придумывают игроки — если, конечно, они не нарушают при этом наши правила), мы успели перенести Джиту на самый мощный сервер, схожим образом позаботились о соседних планетных системах и приготовились оперативно реагировать на события, делая всё возможное для того, чтобы участникам операции (как вольным, так и невольным) было удобно и приятно играть. «Пожар» начался в пятницу утром, на день раньше обещанного; мы занялись сбором данных и настройкой софта, вдохновлённые напутствием CCP Veritas — «очень хорошо, мы всё равно не собирались сегодня вечером отдыхать».
Прежде чем мы перейдём к обсуждению подробностей, я хочу вкратце рассказать вам о проекте, имеющем непосредственное отношение к «Пожару» — речь пойдёт о «замедлении времени» (Time Dilation, TiDi, далее — ЗВ).
ЗВ позволяет нам проводить большие сражения без существенного ухудшения игрового процесса. Эта система в буквальном смысле слова замедляет ход игрового времени и гарантирует, что каждое действие, совершаемое игроками, будет обработано и выполнено нашими серверами; таким образом, игровой процесс становится последовательным и предсказуемым. За разработку ЗВ отвечали CCP Veritas и возглавляемая им группа Gridlock — своему детищу они посвятили несколько статей:
- Introducing Time Dilation (TiDi)
- Система Time Dilation в действии (видеоролик)
- Замедление времени» — вести с полей
Появлением на свет ЗВ мы обязаны большим битвам в «нулях» — ничейных регионах на окраинах галактики, где бал правят созданные игроками альянсы. Довольно часто они сходятся в сражениях, общая численность участников которых многократно превышает численность населения целых серверов некоторых других онлайн-игр. Несколько раз ЗВ включалось в системах, относящихся к «лоу-секу», однако в эту пятницу в зоне действия «замедления времени» впервые на продолжительный срок оказалась система, находящаяся в хорошо охраняемом «хай-секе» — и это принесло нам огромную пользу, позволив ознакомиться с особенностями поведения ЗВ в непривычной для неё ситуации.
Джита всегда существенно отличалась от остальных планетных систем Нового Эдема — как характерными лишь для неё особенностями нагрузки на сервера, так и особенностями взаимодействия с этой системой посещающих её игроков. Всего мы выделяем четыре профиля нагрузки на сервер:
- Битвы в «нулях»; множество кораблей вступают в сражения, перемещаясь при этом между системами в ничейном космосе, за власть над которым сражаются альянсы игроков.
- Системы, в которых собираются игроки, выполняющие задания NPC-агентов (ради получения дохода и удовольствия).
- Торговые хабы, популярные среди финансистов, торговцев и производственников (Джита, Амарр, Ренс и некоторые другие системы).
- Рядовые системы — с точки зрения сервера они ничем не примечательны.
Настройка ЗВ велась с расчётом на обеспечение потребностей обитателей «нулей», хотя в общем и целом те же параметры ЗВ вполне применимы к торговым хабам — естественно, с возможностью дальнейшей оптимизации. Например, система ЗВ обязана очень быстро реагировать на увеличение нагрузки, связанное с одновременным проходом сквозь гиперворота большого количества кораблей, принадлежащих к одному и тому же флоту. Это условие не имеет никакого отношения к реалиям Джиты — зато в «хай-секе» нам приходится иметь дело с системой учёта преступлений Crime Watch (она выдаёт разрешения на ведение огня по другим игрокам) и алгоритмами, управляющими действиями КОНКОРДа (внутриигровой полиции), причём боевые столкновения занимают здесь гораздо меньше времени (но при этом их может быть гораздо больше). Всё это связано с использованием других сегментов кода и другими нагрузками на сервер; таким образом, нам пришлось взяться за перенастройку ЗВ на сервере, обслуживающем Джиту, о чём вам подробно расскажет CCP Veritas.
Взявшись за подготовку сервера к нагрузкам, которые создаются сотнями кровожадных дикарей уважаемых подписчиков, взрывающих корабли в самой населённой системе «Евы», мы столкнулись с тем, что в Джите действует ограничение по максимальному количеству пилотов, одновременно находящихся в системе. Дело в том, что здесь всегда много народу — игроки прилетают в главный торговый центр игры, чтобы продать свои товары или подготовить к приключениям принадлежащие им корабли. Иногда нагрузка от выполняемых торговых операций становится настолько большой, что сервер Джиты оказывается перегруженным, а комфортная игра — практически невозможной; тогда в дело вступает ограничение по количеству игроков, которого нигде больше нет. Мы считаем, что торговые операции вполне могут подождать (в отличие от, скажем, больших сражений); впрочем, сейчас мы говорим о делах давно минувших дней, поскольку случайным следствием проведённой нами оптимизации системы работы с предметами стало двукратное сокращение нагрузки на сервер Джиты. Об ограничении по количеству пилотов все уже успели позабыть, но в связи с «пожаром» нам пришлось о нём вспомнить — решать стоящие перед нами задачи мы собирались именно с его помощью (и с помощью настроек ЗВ). Переходим к самому вкусному — графикам!
«Пожар» начался рано утром 27 апреля. Точной информации о времени начала акции у нас не было, поэтому никаких изменений в настройку Джиты мы вносить не стали — она ничем не отличалась от Джиты-в-любой-другой-день (обычные настройки ЗВ, лимит по количеству пилотов в системе — 2300 человек; на замедление времени до 20% от нормы стоило бы отреагировать уменьшением этого лимита, но я был занят выполнением функции sleep() и всё пропустил).
Если бы мне показали этот график, закрыв рукой его заголовок, и сказали бы, что на нём показан ход большой битвы в «нулях», то я, если честно, поверил бы. Его единственное отличие от данных по настоящим битвам заключается в том, что нагрузка на процессор была равна 60% до начала боевых действий. Во время масштабных сражений изменением степени ЗВ мы добиваемся удержания нагрузки на процессор в диапазоне между 80 и 100 процентами — в данном случае система отлично справилась с этой задачей. Насколько мне известно, начало «пожара» сопровождалось многочисленными перестрелками, так что схожестью графиков мы скорее всего обязаны именно этому обстоятельству.
Через несколько часов произошло плановое отключение сервера; я подзаправился кофе и опустил планку населения Джиты до 1850 человек.
Мы решили, что стоит слегка попридержать темпы развития событий — в системе учёта преступлений было найдено несколько ошибок, появляющихся лишь при взаимодействии с системой ЗВ и по понятным причинам никак не проявлявшихся до начала «пожара». Несмотря на то, что количество пилотов в Джите опустилось до необычно низкой отметки (пишу и сам себе не верю; 1850 человек — это теперь мало?), от включений ЗВ избавиться не удалось; более того, нагрузка на процессор колебалась между 60 и 90 процентами, доходя до 100% лишь в отдельных случаях.
Вечером 27 апреля CCP Masterplan сумел избавиться от очень неприятного дефекта системы учёта преступлений и прикрутить эту заплатку к серверу, обслуживающему Джиту; я же занялся перенастройкой ЗВ и постепенным увеличением количества находящихся в Джите пилотов. Анализ собранных данных показал, что мы имеем дело с высокой средней нагрузкой и малым количеством пиков — нам нужно было настроить сервер так, чтобы в среднем процессор был загружен на 80%, а система ЗВ не реагировала на пики, почти всегда оказывающиеся маленькими. Обычно с началом нового пика нам приходится быстро замедлять время, поскольку этот пик может соответствовать проходу сквозь гиперворота огромного количества кораблей или успешному завершению атаки бомбардировщиков; ничего подобного во время «пожара» произойти не могло.
Грубо говоря, я заставил систему ЗВ замедлять время чуть менее часто и чуть более плавно, параллельно научив её чуть быстрее выходить из режима замедления. Вот как выглядят на графике события субботы (ограничение по количеству пилотов в Джите — 2200 человек):
Ура! Нам удалось добиться искомого результата! Осталось лишь поинтересоваться впечатлениями тех, кто находился на поле боя. Вот что рассказал нам Lazarus Telraven, один из ведущих флиткомов «Гунсворма»:
«Эти выходные следует считать особым днём в истории «Евы» — игроки впервые объявили войну целой планетной системе, а игра отлично с этим справилась. «Поджигатели» практически не жаловались на быстродействие игры — напротив, они без устали хвалили его; все мы сходимся во мнении, что без «замедления времени» у нас ничего не получилось бы. К слову сказать, «практически не жаловались» — это одна-единственная жалоба, всплывшая в ходе опроса всех наших союзников; да, люди сталкивались с «чёрным экраном» при выходе из дока станции и порой не могли переключить обзорную панель в режим «показывать лишь тех, с кем мы воюем», но в целом отзывы о работе игры были исключительно положительными. Один из пилотов GSF (Bagdon) отозвался о ЗВ так: «летал со всеми брэкетами и спецэффектами, всё было за#####; думаю, что теперь я буду чаще играть!». На протяжении всего уикэнда в Джите сидело от полутора до двух с половиной тысяч пилотов, стрелявших друг по другу, перемещавшихся от станций к воротам и обратно, активно пользовавшихся доком — они ни секунды не сидели без дела, но это не создавало никаких проблем, потому что на выручку им всегда приходило «замедление времени». Я с нетерпением жду выхода «Инферно»; мне очень хочется посмотреть на остальные результаты ваших трудов!»
Отзывы игроков о быстродействии игры («летал со всеми брэкетами и спецэффектами, всё было за#####») — это лучшая награда для тех, кто в последние месяцы занимался борьбой с лагом. Более подробную информацию о работе, проделанной нами с момента выхода обновления «Крусибл 1.2», вы можете почерпнуть из статьи «Делаем клиент игры лучше», написанной CCP Veritas; мы сконцентрировали наши усилия на увеличении быстродействия клиента игры, не забывая при этом о выявлении и устранении причин падения частоты кадров. Наша главная задача — полное устранение резких перепадов FPS, уменьшение времени отклика игры, обеспечение предсказуемости её поведения.
Статистика
Тем, кому интересны подробности «пожара», CCP Atlas покажет несколько графиков и одну таблицу; все эти данные собраны при помощи экспериментальной системы EVE Metrics. Начнём с перечисления самых популярных видов оружия, использовавшихся в Джите на протяжении этих трёх дней:
Сравним количество активаций боевых модулей с данными за прошлые выходные:
Обратите внимание: на этих графиках показано не количество сделанных выстрелов, а количество нажатий на кнопки приборной панели, запускающие огневые циклы. За время «пожара» в Джите было произведено 249 021 попадание по космическим кораблям; всего с них было списано 45 117 952 хита. Вот как эти цифры выглядят в динамике (для построения этих двух графиков использовалось движущееся среднее значение с периодом усреднения в один час):
Осталось лишь показать вам, как «пожар» повлиял на количество торговых ордеров, размещаемых на станциях Джиты (красный пунктир — это прогноз на среднестатистические выходные):
Для многих кораблей эти выходные стали последними в их жизни; мы очень рады тому, что смогли обеспечить вам все необходимые условия для их массового уничтожения. Что бы вы ни задумали, мы будем к этому готовы; cюжет этой игры пишется вами!
CCP Explorer, руководитель отдела по разработке ПО
(в соавторстве с CCP Atlas, CCP Manifest и CCP Veritas)