Стажёры Riot: Часть 1

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

Суровые условия работы в разгар мировой пандемии
Суровые условия работы в разгар мировой пандемии

В первой части мы расскажем о работе стажёров над отдельными играми:

LEAGUE OF LEGENDS

ВЭЙ ЧЖАН

Роль: разработчик программного обеспечения

Команда разработки соревновательного режима LoL

Привет, меня зовут Вэй Чжан. Я изучаю игры и информационные технологии в магистратуре Университета Южной Калифорнии. Моя стажировка проходила в команде разработки соревновательного режима LoL. Работа команды заключается в обеспечении наилучшего опыта от игры в соревновательном режиме.

Мой проект заключался в разработке пользовательского интерфейса, который содержит информацию о режиме ранговой игры и наградах за завершение сезона для каждого ранга. Дизайн состоит из текстового описания режима, изображения уровня/дивизиона и карусели карточек с различными наградами. Также отображается прогресс ранга игрока в настоящий момент и предупреждение, если игрок ещё не прошёл квалификацию. Нужно было дать пользователям наглядное представление о текущем сезоне ранговой игры.

Стажёры Riot: Часть 1

Интерфейс клиента League работает на фреймворке Ember.js, а фронтенд состоит из множества приложений с разным функционалом. Приложения разделены на «компоненты», которые состоят из более мелких функций. Эталонная модель нового интерфейса рангового режима – это часть клиентского приложения «Профиль», где отображается информация об уровне и ранге. В модели используется UI kit – пакет программ с вспомогательными функциями и полезными шаблонами для базовых задач разработки UI. Таким образом для модуля обеспечивается соответствие эстетике клиента.

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

Работать с клиентом League было очень интересно и познавательно. До стажировки у меня не было существенного опыта фронтенд- и веб-разработки, и это было мое первое знакомство с Ember.js. У меня бы не получилось привыкнуть к новому для себя стеку технологий и прокачать свои знания без ментора, команды и коллег. Принятая в компании культура совместного развития сразу видна в обзорах кода, ежедневном общении и общем желании создать хороший продукт. Несмотря на все сложности 2020 года, это было феноменальное приключение и я буду вечно благодарен за такую возможность.

ФЕЛИКС ГУО

Роль: разработчик программного обеспечения

Команда технической реализации чемпионов

Всем привет, я Феликс «Arasseo» Гуо, студент Университета Ватерлоо. Этим летом я был стажёром в команде, отвечающей за техническую реализацию чемпионов League. Их проекты разнятся от разработки возможности маскировки любого чемпиона(«Проклятие чёрного тумана» Сенны), до создания других измерений («Царство смерти» Мордекайзера). Команде приходится работать с разными системами, лежащими в основе движка игры, и помогать дизайнерам писать высокоуровневые скрипты взаимодействий заклинаний и умений для каждого чемпиона.

Этим летом я исправлял различные баги, связанные с чемпионами. Например, нужно было корректно настроить скейлы от дополнительного здоровья Кледа, исправить применение адаптивных рун к Элизе, починить визуальное визуальные эффекты обликов «Эзреаль Импульсный огонь» и «Доставщица пиццы Сивир» в режиме наблюдателя. Еще мне выпал шанс разработать диалог выбора цвета для нашего внутреннего скрипта, чтобы упростить прототипирование для дизайнеров.

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

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

Стажёры Riot: Часть 1

КЛИФФ ЧЖУ

Роль: разработчик программного обеспечения

Команда технической реализации чемпионов

Привет! Я Клифф «IG Baolan1» Чжу, изучаю информационные технологии в Университете Карнеги – Меллона. Летом я вместе с Феликсом был стажёром в команде разработки чемпионов. Как уже говорил Феликс, наша команда писала код, с помощью которого чемпионы используют умения. Мы сотрудничаем с дизайнерами, художниками и тестировщиками при создании новых чемпионов.

Во время стажировки я исправил различные баги, влияющие на игровой процесс и даже на турнирные игры. Например, я устранил прекращение усиленных автоатак Рек'Сай после использования ее абсолютного умения, убедился, что Лиллия может использовать комбинацию E + скачок, а визуальные эффекты ее абсолютного умения не перекрываются шкалой здоровья крупных чемпионов, настроил корректное значение урона усиленных атак Дариуса по барьерам, блокирующим умения, и многое другое. Также я создал инструменты, которые отключают опыт и позволяют настраивать уровень чемпионов в тестовых билдах, чтобы при необходимости замедлять игровые тесты.

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

Меня впечатлила не только техническая часть работы, но и корпоративная культура Riot. Все очень доброжелательны, всегда готовы поддержать и преданы делу. Благодаря постоянному фидбеку и созданным между нами связям мы работаем над тем, чтобы League of Legends становилась всё лучше.

АЛЕССИО СИМОНС

Роль: разработчик программного обеспечения

Команда киберспорта

Привет, я Алессио "Asymons" Симонс, я заканчиваю школу при Университете Ватерлоо, где изучаю информационные технологии. Я был стажёром-разработчиком в команде киберспорта. В основном я работал над системой Drops, с помощью которой операторы веб-сервисов могут дарить призы зрителям за просмотр трансляций на lolesports.com.

Я работал над возможностью показывать логотип спонсоров в определенном месте. Некоторые спонсоры не хотели, чтобы их логотип перекрывал картинку. Это вызвало некоторые проблемы, потому что пришлось бы изменить изображения в различных местах страницы с Drops. В итоге мы сделали так, что изображения масштабировались в зависимости от расположения на странице, а не просто были либо крупными, либо мелкими.

На первый взгляд это казалось легкой задачей – просто добавить столбец в базу данных. Но Drops уже запустили, поэтому нужно было переместить изменения из старых столбцов в новые и не сломать существующую систему. Методом проб и ошибок, работой с SQL и множеством сервисов мы смогли переименовать некоторые столбцы и скопировать данные в новые, чтобы выполнить требования спонсоров. С помощью Liquibase мы смогли постепенно переместить все данные в свою базу и поочередно применить результаты.

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

TEAMFIGHT TACTICS

РИД ЧЖАН

Роль: специалист по обработке данных

Команда центра обработки данных League

Привет, я Рид, стажёр центра обработки данных League (LDC). Мы занимаемся связанными с обработкой данных проектами League of Legends, Teamfight Tactics (TFT) и Wild Rift. Наши системы, например, алгоритмы матчмейкинга и система «Ваш Магазин», напрямую влияют на получаемый игроками опыт. Я занимался обработкой естественного языка (NLP) для анализа отзывов к мобильному приложению TFT.

Мобильное приложение загружают миллионы пользователей, и каждый день оно получает несколько сотен отзывов. Целью моего проекта было понять, что говорят игроки, и помочь продакт-менеджерам и аналитикам быстро выявить пожелания пользователей. Эта работа включала две основные задачи:

  1. Отследить популярные темы.
  2. Постоянно определять, когда отзывы соответствуют любой новой теме, созданной пользователем-человеком.

РЕШЕНИЕ

Чтобы выявить значения в тексте, мы пользовались двунаправленной нейросетью BERT (Bidirectional Encoder Representations from Transformers). Это модель NLP обучена на больших объемах текста (в основном на Википедии). Почти все модели BERT обучены классифицировать текст, но мы можем использовать скрытые функции для векторного представления слов, чтобы, возможно, выявить значение текста. Эта технология похожа на Word2Vec, Autoencoders и другие методики глубокого обучения для векторных преобразований. С помощью хорошей модели можно определить по отзыву о чём он: лаги, соединение, баланс игры или чем-то ещё, что нам интересно.

Вычисления соответствия отзыва теме
Вычисления соответствия отзыва теме

Для доказательства теории, мы натренировали BERT-модель относить текст к одной из нескольких категорий. Они определялись по наличию ключевых слов, и модель обучалась только на данных опроса игроков League. Но косинусный коэффициент векторных представлений модели был неточным примерно для половины интересующих нас тематик. Тогда мы стали использовать маскированную языковую модель (её можно обучать без учителя, в отличие от классификатора тем). Также мы включили данные, характерные для TFT, и поэкспериментировали с параметрами модели и векторов. После этого результаты заметно улучшились.

РЕАЛИЗАЦИЯ

Мы взяли интерпретации Tensorflow для BERT c HuggingFace. Чтобы окончательно настроить модель BERT, нам потребовалось около 4 часов для одного кластера GPU. Мы настроили дашборд Tableau для отслеживания соответствия определенным темам в различных регионах, а еще написали скрипт на Databricks, который берет вводные данные с гугл-таблицы и отправляет результаты по электронной почте (это лучше делать в вебе, но у нас были ограничения по времени).

Часть дашборда Tableau
Часть дашборда Tableau

ИТОГИ

Для меня самой крутой частью стажировки было то, что мы использовали новейшую NLP-разработку – BERT, чтобы помочь Riot лучше понимать желания игроков. Пришлось многое изучить, чтобы понять принципы работы Transformers и BERT, но это было не зря, ведь я узнал много нового и смог использовать эти знания для проекта. Мне очень понравилась культура обучения и открытости новому, принятая в Riot. Например, мой ментор всегда позволял мне пробовать то, что казалось мне полезным и интересным, даже если мы не были уверены, что это будет работать.

КАЛЛЕН ТУ

Роль: разработчик программного обеспечения

Команда игрового процесса TFT

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

Этим летом я занималась улучшением итогов боя в TFT. В настоящий момент итоги показывают, сколько урона нанесли боевые единицы игрока в последнем сражении. Я должна была определить и отобразить новые данные – о заблокированном уроне, щитах и лечении. Такое улучшение итогов боя поможет игрокам анализировать показатели защиты и поддержки. Изменения появятся в игре с патчем 10.20.

Стажёры Riot: Часть 1

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

Стажёры Riot: Часть 1

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

Кроме того, я успела поработать в качестве дизайнера: поучаствовала в создании юнита и пары синергий в новом наборе снаряжения. Это всё значительно отличалось от обычной разработки: помимо прочего, нужно было написать немного текста для игры. Очень интересно узнать, как игроки оценят новый набор!

Я сотрудничала с замечательной командой. Окружение и рабочая обстановка были очень дружелюбными. В Riot все смело изучают сложные темы и решают возникающие проблемы. Я была впечатлена тем, что работники Riot постоянно растут над собой и делают все, чтобы компания процветала. Эта стажировка была отличным опытом, и я очень благодарна за возможность поработать в Riot.

ХЕНСЕН ХЬЮИН

Роль: разработчик программного обеспечения

Команда персонализации TFT

Всем привет! Я Хенсен Хьюин, учусь в магистратуре Калифорнийского университета в Сан-Диего. Этим летом я был стажером-разработчиком в команде персонализации TFT. Персонализация затрагивает косметические предметы и другие опции, касающиеся внешнего вида: боевой пропуск, меню коллекции (в нем вы выбираете, что надеть), магазин TFT в мобильной версии, награды Twitch Prime и другие внеигровые сервисы.

Я сосредоточился на клиенте League, добавил новые возможности и улучшил меню снаряжения для TFT. Мне предложили различные опции, которые я должен был внедрить в удобном для меня порядке. В итоге я занимался новым разделом для предметов, подсветкой недавно полученных предметов и строкой поиска.

НОВЫЙ РАЗДЕЛ ДЛЯ ПРЕДМЕТОВ

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

Стажёры Riot: Часть 1

ПОДСВЕТКА НОВЫХ ПРЕДМЕТОВ

Сложность была в том, что для нас не было подходящего способа определить, новый предмет или нет. Также мы хотели, чтобы предметы оставались подсвеченными, пока на них не наводили курсор или пока игрок не открывал конкретную вкладку (например Little Legend), а затем выходил из игры. Чтобы точно отслеживать выход из игры, я добавил эндпоинт, который сохраняет последнее время открытия вкладки коллекции, и после этого предметы уже не считаются новыми. Зная время покупки и последнего открытия вкладки, мы определяем, нужно ли подсвечивать предмет. Эта информация вместе с данными о предмете отправляется на фронтенд, где мы отслеживаем наведение курсора на предмет до закрытия вкладки. При закрытии вкладки мы получаем данные о том, на какие предметы наводился курсор: эти предметы уже не считаются новыми.

Стажёры Riot: Часть 1

ПАНЕЛЬ ПОИСКА

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

Мне очень понравилось работать с Riot Games. Это была лучшая удалённая стажировка, которую можно было представить. Среди внимательных и приветливых коллег я чувствовал себя очень комфортно. Меня особенно впечатлил индивидуальный подход к каждому. Я узнал много нового от разных людей и получил разнообразный и полезный опыт.

VALORANT

КЕНТА ТЕЛАМБУРА

Роль: разработчик программного обеспечения

Команда ключевых сервисов

Привет! Я Кента "kenbobernator" Телламбура, изучаю разработку ПО в Альбертском университете. Этим летом я проходил удалённую стажировку в команде ключевых сервисов VALORANT. Эта команда занимается бэкендом и разработкой сервисов для игровых серверов. Я узнал, как много аспектов игры задействуется в нашей работе, и мне удалось поработать над некоторыми микросервисами.

Бэкенд VALORANT в основном состоит из микросервисов на Go. У каждого из них своя важная роль. Этим летом я исправлял ошибки и внедрял новые функции в эти микросервисы. Работая над отдельными компонентами, я смог лучше узнать, как все работает в совокупности.

СОЗДАНИЕ ЭНДПОИНТА ДЛЯ СТОРОННИХ РАЗРАБОТЧИКОВ

Мне пришлось работать над резными сервисами, но самым интересным было внедрение эндпоинта для сторонних разработчиков. У Riot есть API для доступа сторонних разработчиков к данным игры. Мне нужно было разработать эндпоинт, который возвращает ID всех матчей VALORANT за прошедший час. Но учитывая количество одновременных матчей, это оказалось более сложным заданием, чем я предполагал.

Стажёры Riot: Часть 1

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

Первая итерация в нашем окружении работала хорошо. Мы быстро получали результаты и не заметили никаких ошибок и проблем с производительностью. Но когда мы проводили нагрузочное тестирование на серверах с симуляцией определенной частоты завершения матчей, возникли ошибки. Пиковый размер возвращаемого списка ID матчей достигал 20–30 МБ! Чтобы отправить JSON-ответ клиенту, требовалось несколько секунд, что было неприемлемо. Ведь это могло замедлить весь сервис и в итоге сказаться на качестве игры!

Самым легким возможным решением было уменьшить время последних матчей с 1 часа до 10 минут. Но даже в этом случае запрос весил несколько мегабайт и ответ возвращался слишком долго. Поэтому мы решили сжать ответ. Теперь он возвращался не как сырой JSON, а как файл gzip. Кроме того, он кэшировался и сохранялся в памяти, чтобы уменьшить нагрузку на нашу базу данных и увеличить скорость ответа. После этих изменений мы снова провели нагрузочные тесты. Размер и время ответа существенно снизились. Мы внесли еще кое-какие изменения в сервис и в итоге остались довольны результатом.

Вначале этот проект казался простым, но оптимизировать все так, чтобы вписываться в ограничения производительности, оказалось очень интересно. Я понял, что даже простейшие вещи становятся сложными, если они разрабатываются для тысяч и миллионов игроков. Я недолго поработал с Riot из-за COVID-19, но мой вклад в проект и полученный опыт превзошли мои ожидания. Изменения, над которыми я работал, должны уже вступить в силу к моменту публикации этой статьи. Надеюсь, кто-нибудь из читателей-разработчиков воспользуется новыми возможностями и сделает что-то крутое.

Спасибо всем стажёрам за их старания и отличные проекты!

3030
30 комментариев

Ни одного россиянина. В чем смысл этой статьи для аудитории дтф?

2
Ответить

Комментарий недоступен

2
Ответить

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

Ответить

Комментарий недоступен

Ответить