Мы делали ремастер
целый год
Gamedev
Wargaming

Правильный матчмейкинг: «классика» против «модерна»

Иллюстрированная драма в четырех частях о том, как собрать увлекательный бой в онлайн-игре на примере World of Tanks Blitz

«Все счастливые семьи похожи друг на друга, каждая несчастливая семья несчастлива по-своему», — Л.Н. Толстой, «Анна Каренина»

Меня зовут Дмитрий Антошкин, и мне посчастливилось быть частью международной команды Wargaming MS-1, которая, среди прочего, разрабатывает мобильный танковый шутер World of Tanks Blitz. Наш офис в Минске известен всем, а вот то, что у нас теперь есть большие подразделения в Вильнюсе и Москве, знают не многие.

Несколько команд, в том числе и команда, которая отвечает за поддержку и развитие матчмейкинга, как раз находится в московском офисе. Который расположен на Садовом кольце. А оттуда, с Курского вокзала, регулярно ходят электрички до Тулы. А оттуда до Ясной Поляны рукой подать! Ну в общем, вы поняли, причем тут Лев Толстой))

Оттолкнувшись от классика, я хочу начать наш рассказ о матчмейкинге в онлайн-играх с фразы «Все победившие игроки радуются одинаково, каждый проигравший несчастлив по-своему». Игроки World of Tanks Blitz не исключение, и тем не менее попробуем немного отодвинуть эмоции в сторону и разобраться из каких кусочков состоит ключевая система любой многопользовательской игры — его величество Матчмейкер.

Часть первая: «классический матчмейкер»

«Как тихо, спокойно и торжественно, совсем не так, как я бежал, — подумал князь Андрей, <…> Да! Все пустое, все обман, кроме этого бесконечного неба. Ничего, ничего нет, кроме его. Но и того даже нет, ничего нет, кроме тишины, успокоения. И слава богу!» — Л. Н. Толстой, «Война и мир»

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

Но мы договорились, что наши эмоции временно наблюдают только за небом Аустерлица, оставшаяся же на земле логика подсказывает нам, что задача подбора боя упирается в две крайности: матчмейкер либо собирает бой максимально быстро, либо максимально качественно. И если вы геймдизайнер, то нужно четко определить, что такое «быстро» и что такое «качественно».

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

Размер команд

На практике чаще всего встречаются игры двух игроков друг против друга (PvP-игры такие как Hearthstone, Clash Royale и другие). С точки зрения матчмейкинга многопользовательских игр режим «один на один» можно назвать минимальным требованием к размеру боя: алгоритм выбирает двух игроков из очереди и далее проверяет соблюдение всех остальных правил. Матчмейкер World of Tanks Blitz собирает бои из 14 игроков (7 на 7), но встречаются и более сложные варианты (например, World of Tanks — 30 игроков, PUBG — 100 игроков).

Чтобы понять разницу в сложности задачи сбора качественного боя для случаев двух и ста игроков можно попробовать представить себе следующую игру: вы бросаете монетку два раза, тогда вероятность, что оба раза монетка упадет одинаковой стороной равна 50%. А теперь представьте, что монетку нужно бросить 100 раз и результат должен 100 раз повториться? Пытливые умы могут в комментариях посчитать вероятность такого исхода.

Конечно, нам не нужны все одинаковые игроки в бою — это будет скучно, но нужно учитывать, что сложность алгоритма матчмейкинга растет с увеличением количества игроков, быстрее чем чужие дети.

Баланс по скиллу

Прежде всего важно понять, что такое скилл — как правило в каждой из игр ответ будет разным. Для измерения скилла применяются формулы различной сложности: от простого винрейта до ранговых систем (рейтинга Эло или TrueSkill, например). Мы в Blitz’e используем аналог рейтинга Эло.

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

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

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

Рейтинг и справедливость — как Каренина и Вронский — никогда не будут вместе, но стремятся друг к другу всем сердцем. Мы в World of Tanks Blitz постоянно изучаем возможности сближения идеала и реальности, и, если у вас есть свои варианты сюжета для этой драмы или любые идеи — предлагайте их в комментариях.

Для того, чтобы увеличить разнообразие и снизить время сбора боя, можно смягчить ограничения на различия в рейтинге. Например, в World of Tanks Blitz в основном и самом популярном игровой режиме «Обычные бои» ограничений на скилл игроков нет совсем — это позволяет максимизировать разнообразие сетапов команд и снизить время сбора боя относительно другого режима, Рейтинговых боев, в котором есть матчинг по рейтингу, и игроки участвуют в максимально конкурентных боях.

Баланс по ролям и уровням героев

В играх встречается большое разнообразие геймплейных ролей у героев (например, «дамагер», «хилер», «разведчик» и другие), ключевые навыки которых можно прокачивать, повышая их уровень. Задача матчмейкера в этом случае — собрать бой с минимальными различиями в уровнях героев, и ограничить дисбаланс в ролях героев между командами.

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

С ролями героев ситуация аналогичная. Игры построены по принципу «камень-ножницы-бумага»: в бою один на один роль «камень» побеждает роль «ножницы», и так далее. Таким образом дисбаланс команд по ролям может иметь тот же результат, что и дисбаланс по уровням: команды, в которых большинство игроков играют героями с ролью «камень», как правило будут побеждать команду, в которой большинство игроков «ножницы», и такой бой не доставит удовольствия ни тем, ни другим. Пульс, небо, Аустерлиц, глаза, кровь. Ну вы поняли.

Баланс по друзьям

Часто игрокам дается возможность объединяться и заходить в бой группами. Например, World of Tanks Blitz игрок может пригласить другого игрока во взвод и выйти на поиск боя, тогда матчмейкер должен собрать бой так, чтобы игроки взвода оказались в одной команде.

Если в игре существует такая возможность, то в противоположной команде тоже должна оказаться «группа друзей», похожая по размеру, скиллу и ролям (то есть сбалансированная по всем правилам), поскольку организованная группа имеет высокую согласованность действий, что, конечно, повышает для их команды шансы на победу.

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

Время ожидания боя

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

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

Часть вторая: Арзамасский ужас

«Третьего дня в ночь я ночевал в Арзамасе, и со мной было что-то необыкновенное. Было 2 часа ночи, я устал страшно, хотелось спать, и ничего не болело. Но вдруг на меня нашла тоска, страх, ужас такие, каких я никогда не испытывал», — Л.Н. Толстой, из писем жене

Предположим, что мы установили целевое время ожидания в 20 секунд, придумали алгоритм матчмейкера, запускаем прототип и получаем среднее время ожидания 120 секунд — что делать? Как правило, мечты об идеале рушатся еще на этапе тестов и встает вопрос — каким из правил идеального боя жертвовать?

Как конкретно происходит процесс выбора жертвы мы опустим (про это можно прочитать у Льва Николаевича и других классиков), обсудим лучше наши возможности:

  • Уменьшать размер команд? Этот вариант на практике почти не встречается, поскольку количество игроков в командах сильно меняет геймплей. У этого правила наивысший приоритет. Однако во многих играх используются боты для того, чтобы дополнить бой, который нельзя сбалансировать только за счет обычных игроков. Главное ограничение для этого снижения качества — его можно использовать только для новичков, так что фактически боты выступают в качестве «обучающего материала».
  • Ухудшать баланс по скиллу? На практике часто используют расширение возможного разброса по рейтингу или другим метрикам скилла в зависимости от времени ожидания (например, в Clash Royale смягчается требование к уровню короля).
  • Ухудшать баланс по ролям и\или уровням? Этим жертвуют, как правило, в первую очередь, однако не до конца, иначе игра превратится в хаос. Например, матчмейкер в Blitz’е никогда не ослабляет правила баланса по уровням танков, но может ослаблять правила по количеству танков одного типа в команде.
  • Ухудшать баланс по друзьям? Это правило встречается редко, жертвуют им редко — как правило «друзья» согласны дольше ждать в обмен на возможность сыграть вместе.

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

Часть третья: матчмейкер в World of Tanks Blitz

«Пьер – наследник всего и, сверх того, признан законным сыном и потому графом Безуховым», — Л.Н Толстой, «Война и мир»

Подробное описание нашего алгоритма матчмейкинга World of Tanks Blitz уже было опубликовано тут, поэтому мы приведем лишь его краткий обзор для сравнения с «классическим» матчмейкером.

World of Tanks Blitz — это многопользовательский мультиплатформенный танковый шутер, в котором бои проходят 7 на 7 игроков в Обычном, Рейтинговом и нескольких аркадных режимах (Гравитация, Возрождение, Реалистичный и так далее). Также игроки с мобильных устройств могут выбрать играть им против игроков на ПК или нет.

Игроки могут выйти в бой на танках 4 типов (легкие, средние, тяжелые и ПТ-САУ), каждый из которых относится к одному из 10 уровней, всего в нашей игре более 400 танков разных уровней и типов, и их количество постоянно растет.

Основные правила и возможность их смягчения в зависимости от времени поиска можно увидеть в таблице:

Общая картина, как видите, от классики отличается не сильно, мы в основном используем все общепринятые правила. Главное отличие нашего матчмейкинга от других игр — большее разнообразие, которое он поддерживает. Это и разнообразие танков, и разнообразие девайсов наших игроков, и разнообразие режимов (одновременно игрокам может быть доступно до 4 режимов, для каждого режима в матчмейкере World of Tanks Blitz своя отдельная очередь поиска боя), и география (наши игроки есть в пяти географических зонах, во всех часовых поясах).

Часть четвертая: матчмейкер модерна и постмодерна

«... кто будет злей драться и себя меньше жалеть, тот победит. Завтра, что бы там ни было, мы выиграем сражение!» — Л.Н Толстой, «Война и мир»

Пока классик почует на лаврах, разработчиков World of Tanks Blitz волнует та самая эмоциональная составляющая восприятия матчмейкера игроками, которую, конечно, можно попробовать отбросить, но ни один живой человек надолго этого сделать не сможет.

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

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

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

А пока расскажу вам о двух подходах к снижению количества турбобоев, которые мы сейчас прорабатываем:

«Модерн»

Мы тестируем возможности внедрения баланса по скиллу в рандомный режим, но не совсем в классическом понимании. Если пытаться кратко описывать нашу идею, то мы хотим присваивать рейтинг, но не всем игрокам, а только «худшим» (мы называем его антирейтинг), и балансировать бои по количеству игроков с антирейтингом и по их антирейтингу. Эта позволяет учесть, что у каждого из нас бывают «черные полосы» — и в жизни, и в игре — и, как только результаты игрока нормализуются, его антирейтинг обнулится.

«Постмодерн»

Мы идем от обратного, от турбобоев (боев, которые заканчиваются быстро и с крупным счетом), и пытаемся методами machine learning по итогам сбора боя матчмейкером предсказать вероятность того, что бой закончится жалобами игроков на соперников и союзников. Звучит сложно и запутанно? Добро пожаловать в Мир танков Blitz!

Ну и самый важный вопрос: какой из методов больше повлияет на время ожидания боя?

Вместо эпилога

Если у вас, Лев Николаевич, в Ясной Поляне закончился интернет, то автобусом до Тулы, потом электричкой до Курского вокзала, заходите в метро — вам нужна станция Серпуховская — выходите (выход там один) и осталось 3 минуты пешком. Ну вы поняли)))

А если вы прочитали этот текст, заинтересовались и захотели работать над World of Tanks Blitz и другими мобильными играми, то вот несколько вариантов, как можно присоединиться к команде Wargaming MS-1 Москва:

Middle/Senior Server Developer (World of Tanks Blitz)

QA Engineer (World of Tanks Blitz)

Game Economy Designer (World of Tanks Blitz)

0
12 комментариев
Популярные
По порядку
Написать комментарий...

Если что, в Call of Duty автобаланс работает примерно следующим образом (честно слизно с Reddit):

3

)))))

0

Упущен один важный момент, что процентов 70 боёв, если у тебя танк низкого лвла, особенно если, его статистика выбивается из одноуровневых, ты играешь внизу списка! Вот этот момент прояснили бы, как так получается, что заходишь на 7 лвл, ты с 8ками играешь, на 8й лвл пошёл, а тебя по любому к 9км кинут

0

Добрый день, у нас в Блитце такого правила нет - уровень боя определяется случайно

0

я бы вам, конечно поверил) Но по опыту я вижу, что это не так, а у меня около 40 тысяч боёв.

0

Ваше право - верить или не верить)) а насчет опыта - у меня у самого горит, когда кидает уровнем выше, а когда на уровень ниже воспринимаю как "нормальность", поэтому возникает смещение восприятия

0

так проблема в том, что выше кидает ощутимо чаще. и это прямо заметно

0

А ты денег заплати) Тебя будут чаще нагибать если ты не платишь, и ты будешь чаще нагибать если платишь, примерно 60/40(настраивается). В конечном итоге роляют деньги = плательщики. Почти во всех играх в которых принимал участие в разработке я делал систему “замораживающую/замедляющую” твой рейтинг после инапа на N боев/побед/очков/игровой_валюты/времени... это делается для того чтоб заплатив игрок получил дозу эндорфина. Смысла нет платить если получив танк 10 левела ты пойдешь сразу к 10кам, дают сначала понагибать твой текущий уровень и только затем идешь выше(чтоб еще заплатить захотел). Выглядит с моих слов это конечно грубо, но это называется “баланс“, который тщательно точат так чтоб максимизировать прибыль, но и органику не растерять.

Но возможно здесь и другой случай. Эло изначально это рейтинг для шахматистов, где пофиг какими ты играешь фигурами - деревянными или хрустальными... Здесь же есть "скилл"(эло рейтинг) и есть мощь твоего гаража(танк/робот/пушка/обвес). И получается подбор идет уже в 2-мерной плоскости... тебе возможно кидает оппонентов выше тебя т.к. у тебя скилл хороший но он не достаточно хороший чтоб вывезти бой с 9ми на 8ке(не от того что скилл слаб, а от того что скиллом сложно перкрыть разрыв между уровнями танков)... ты играешь пару-тройку боев, проигрываешь -> твой рейтинг падает-> ты возвращаешься к 8кам и нагибаешь -> рейтинг растет = снова страдания. Барическая пила своего рода, только спуститься в рейтинге как правило сложнее чем подняться в таких играх - баланс заинтересован в том чтоб у игрока был стимул вкачивать свой ангар(либо долго и нудно добывай игровую валюту честным трудом = ты мясо для плательщиков, чем больше мяса - тем лучше плательщикам. Либо занеси инап).

P.S. Автору: За статью спасибо, +- все как и везде, но было интересно сравнить.

0

сложная тема, спасибо за освещение

0

Вам спасибо за интерес

0
Абстрактный дебаркадер

Это все, конечно, очень интересно (танкистам). Но вы мне вот что скажите (на примере игры Overwatch).

Разве результат прошлого боя должен влиять на результат следующего боя? То есть, если я каким-то образом проиграл матч (из-за своих ошибок, ошибок тиммейтов или просто решил вбросить каточку), то должен ли матчмейкинг это учитывать и в следующем матче подобрать мне в команду более сильных игроков (или более слабых против меня)? Потому что очень многие считают, что там система матчмейкинга делает всё возможное, чтобы удержать игрока на 50% винрейта. И чем выше ваш винрейт, тем более скилловых врагов (и раковых тиммейтов) вам будут подкидывать (и наоборот). Но я считаю, что это в корне неверное решение. Результат одного матча не может (и не должен) влиять на результат другого матча. Если вы подбросите монетку и вам выпадет Орёл, это не значит, что в следущий раз вероятность выпадения Решки будет выше.

Также хотелось бы поговорить о рейтинге Эло. Это, безусловно, хороший индикатор скилла игрока, но у него есть свои минусы. Для примера, я буду брать все тот же Overwatch. Там есть рейтинг, и он может меняться в пределах одного матча от -25 до +25 (примерно). Как известно, у каждого игрока может случится плохой день, когда он делает всё для победы, но проигрывает. Один матч, второй, третий... Иногда доходит и до десятого. И вот наш игрок уже в минусе на 200 очков рейтинга. Однако... Отражают ли эти цифры общий уровень игрока? Считаю, что нет. В играх бывают как апстрики (вы выигрываете, не прикладывая усилий), так и даунстрики (поражения, не смотря на все ваши старания). Однако, эти события при большой выборке матчей не особо влияют на общий уровень игрока. Но если брать обычный рейтинг, то такие "качели" могут сформировать неправильное представление у игрока о его скилле. Мы ведь все знаем, что если мы побеждаем - то это наша заслуга, а если проигрываем - то виноваты тиммейты/разработчики/матчмейкинг/Аллах (нужное подчеркнуть). Вот у нас было 3000 рейтинга, мы сегодня много и легко выиграли, в итоге у нас 3400. Но в реальности игрок не стал играть лучше. Цифры не отражают реальный уровень игры игрока, потому что его скилл изменяется гораздо медленнее, чем эти цифры. Поэтому в таких случаях (как мне кажется) стоит вводить среднее значение рейтинга (по формуле: сумма рейтинга после каждого матча/количество матчей). Да, игрокам в таком случае придется сложнее, поскольку чем больше матчей наиграет игрок, тем меньше будет шаг изменения его реального уровня игры. Однако, игрок, который стабильно хорошо играет все равно будет идти вверх (пусть и медленнее). И различные факторы (тролли, ливеры, читеры, смурфы) не особо повлияют на его уровень игры (и он будет видеть это на графике в самой игре, что должно быть - рейтинговая статистика должна быть открытой, понятной и прозрачной).

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

–1

Добрый день. 1) матчинг по скиллу - это правила игры или одного из режимов, у нас есть режим без матчинга по скиллу, можете играть в этом режиме 2) скорость изменения рейтинга это настраиваемый парамтер для каждой игры - у нас в Блитце он зависит от уровня рейтинга. Принципе такой (числа примерные): если у вас рейтинг 3000, то максимальные колебания рейтинга за бой +\-50, а если ваш рейтинг 5000, то максимальные колебания меньше - +\- 10

0
Читать все 12 комментариев
null