Микрообновления спасают Анивию

Автор: bananaband1t

Несколько недель назад королева Анивия принесла в Ущелье дух карнавала. Все наслаждались веселым праздником и яркими костюмами – пока на ледяную птицу не стали жаловаться. Специалисты Riot Games по контролю качества быстро подтвердили, что абсолютное умение Анивии не удваивало урон Обморожения должным образом. Ошибка очень сильно меняла игру – нам пришлось на время отключить чемпиона, чтобы найти способ исправить ситуацию, а затем оперативно протестировать изменения, прежде чем вносить их на основные игровые серверы. Вновь играть за Анивию можно было бы не раньше середины дня в пятницу... но по пятницам мы внедряем исправления только в самых крайних случаях, потому что слишком высок риск неумышленно создать серьезную проблему в пиковое время на выходных.

В общем, вечеринку пришлось прервать сразу же после ее начала, а Анивию – забрать из Ущелья до понедельника. Правда, на самом деле Анивия сидела на скамье запасных не все выходные.

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


Углубимся (немного) в технические детали

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

Игровой сервер – это то, к чему вы подключаетесь после выбора чемпиона. Что-то вроде маленькой вселенной, в которой запускаются ваши личные игры 5х5 (или 3х3, или 1х9). Когда мы вносим изменения в данные на игровых серверах, простоев и загрузок не бывает. Серверы хранят числовую информацию, такую ​​как параметры чемпионов, а также скрипты, управляющие работой умений (но необязательно их внешним видом).

Разработка картинки Королевы карнавала Анивии

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

Повторно развертывать код – немалый риск. При этом отделу контроля качества приходится оперативно тестировать исправления, хотя большинство проблем незначительны и требуют изменения лишь небольших фрагментов данных. Проблема в том, что повторно развернуть только один фрагмент данных нельзя – приходится менять все. Специалист по программной архитектуре Брайан Боссе (он же Riot Penrif) говорит, что "масштабная процедура по внедрению маленького изменения, требующая интенсивного контроля качества, может быть слишком затратной и порой неоправданно рискованной".

И даже после оперативного тестирования мы все равно выполняем повторное развертывание по пятницам только в экстренных случаях (например, если ранговые очереди не работают или играть можно только за Тимо). Некоторые элементы архитектуры League of Legends были созданы давным-давно. Тогда мы и представить не могли, какой вес придется выдерживать этому – не во всем надежному – фундаменту.

В прошлом после повторного развертывания данных клиента исполняемый файл League of Legends удалялся, т.е. никто не мог даже открыть игру. Ведущий специалист отдела выпуска обновлений Донна Мейсон, также известная как Riot Feithen, говорит: "В идеале при каждом нажатии кнопки должно происходить всегда одно и то же, но иногда это не так".

Мы все еще работаем над обновлением устаревших основ League of Legends, но пока время от времени повторное развертывание данных происходит непредсказуемо. Мы стараемся действовать осторожно, особенно перед выходными, потому что повторное развертывание подразумевает пересылку всей информации, даже если изменения небольшие.

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


Микрообновления, скрытные супергерои

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

Мы можем реализовать микрообновление во всем мире менее чем за две минуты.

Благодаря этому микрообновления гораздо безопаснее и быстрее, чем повторное развертывание данных. Во-первых, микрообновления записываются поверх существующих данных без пересборки сервера, поэтому изменения не настолько глобальны. Во-вторых, микрообновления очень легко внедрять и отменять. Мы можем реализовать микрообновление во всем мире менее чем за две минуты – и удалить его так же быстро.

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

За несколько недель до критичной ошибки с Анивией технология спасения чемпионов была доработана – теперь мы можем вносить целенаправленные изменения в скрипты умений через микрообновления.


Перерождение Анивии

В день дебюта Королевы карнавала Анивии мы узнали, что все ее образы применяют абсолютное умение с ошибкой. Ребята из отдела по контролю качества дружно взялись за поиски причины. Младший геймдизайнер Мэттью Льюнг-Хэррисон (он же PhRoXzOn), работавший над Анивией в обновлении 6.23, говорит: "Как только я увидел ошибку, я сразу понял, в чем дело".

Для каждого чемпиона League of Legends есть логический файл со скриптами, которые задают параметры персонажа. В нем необязательно содержится информация о том, как выглядят умения или сколько они наносят урона. Скорее файл управляет их функционированием – его можно сравнить с материнской платой, которая собирает все данные и преобразует их в то, что вы видите на экране.

Из-за путаницы мы отправили на основные игровые серверы неисправную версию логического файла с абсолютным умением Анивии. В результате, на первый взгляд, все вроде бы было нормально: при нажатии на клавишу R умение активировалось и появлялись симпатичные эффекты, но оно не функционировало надлежащим образом. Ледяная буря должна в течение двух секунд удваивать урон от Обморожения, но на самом деле эффект длился всего 0,5 секунды. Как говорит ведущий эксперт отдела контроля качества Брайан Браузе (он же Aotus): "Чемпион делал красивые па... а урон не наносил".

Определив источник неполадки, мы обновили логический скрипт Анивии и протестировали нововведения. Как выяснилось, свежую ошибку мы исправили, но более доскональный поиск выявил старую уязвимость, возникшую еще в обновлении 6.23. К счастью, контроль качества микрообновлений не занимает много времени, поскольку мы проверяем результаты только одного конкретного изменения. После второй поправки все заработало: обе ошибки удалось устранить, и микрообновление теперь было готово к отправке на игровой сервер.

Какая уж там блокировка на выходные! Всего через четыре часа мы вернули Анивию зажигать (точнее говоря, морозить) и радовать всех в Ущелье.


Микрообновления – решение всех бед?

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

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

Тем временем Riot Penrif шутит: “Если какая-то неисправность вдруг сама собой устранилась, можно просто предположить, что на помощь пришли микрообновления”.


2 months ago