Матчмейкинг

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

Матчмейкинг в играх на основе матчей, как правило, направлен на:

  • найти других игроков на основе критериев, таких как регион, задержка, навык или параметры игры;

  • поиск серверов чтобы присоединиться на основе доступной ёмкости [или пинга, региона, навыка, карты, режима];

  • запустить новый сервер если существующие серверы заполнены или не соответствуют критериям игроков.

Опыт игрока стоит на первом месте, определяя наши основные цели:

  • высокий процент заполнения матчей и интеграция социальных функций (игра с друзьями в группах),

  • быстрые матчи с контролируемым качеством матчей (низкая задержка, общие предпочтения),

  • надёжный и предсказуемый процесс матчмейкинга с глобальной доступностью.

Просмотрите это видео, чтобы начать работу с нашим сервисом Matchmaker:

✔️ Подготовка

Тестирование этого сервиса полностью бесплатно, кредитная карта не требуется.

Бесплатный уровень позволяет до 3 часов работы на нашем общем тестовом кластере после каждой перезагрузки.

В этом руководстве предполагается, что вы уже:

Архитектура матчмейкинга

В этом руководстве основное внимание будет уделено Matchmaking API и Backfill API.

Существует четыре (4) важных потока данных, когда задействован матчмейкинг:

  1. Matchmaking API используется игровыми клиентами для общения с Matchmaker:

    1. для управления группами, назначения серверов и мониторинга,

    2. для измерения пинга с помощью Ping-маячки.

  2. Развёртывания API используется Matchmaker для развертывания, масштабирования и управления вашими выделенными серверами.

  3. Сетевые транспорты (Netcode Transports) используются для связи между игровыми клиентами и выделенными серверами.

  4. Подробный обзор для замены или добавления дополнительных игроков с сервера.

После релиза, ваш матчмейкер должен работать 24/7 чтобы игроки по всему миру могли присоединяться к серверам.

🍀 Простой пример

Начните с простого примера и протестируйте базовый поток игроков в матчмейкинге:

1. Настройка на бесплатном тарифе

☑️ Зарегистрируйтесь для получения бесплатной учетной записи Edgegap и откройте страницу панели управления Matchmaker.

☑️ Нажмите Создать Matchmaker сначала, затем введите:

  • имя matchmaker — для вашего удобства, например quickstart-dev ,

  • загрузите нашу конфигурацию Simple Example в формате JSON.

🍀 Простой пример (минимально рекомендуемая конфигурация):

Устранение неполадок и часто задаваемые вопросы:

Конфигурация приложения недействительна для профиля XYZ.
Docker-образ для '2024.01.30-16.23.00-UTC' не кэширован.

🌟 Переходите на тариф "Плати по мере использования" чтобы открыть мгновенные развертывания с кэшированием.

  • Образы без кэша размером 4 ГБ и более могут дольше разворачиваться, что приведёт к Развёртывания. Рассмотрите возможность оптимизации размера серверного образа (Unreal Engine / Unity).

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

☑️ Если ошибок валидации не появилось, нажмите Создать и запустить и дождитесь завершения процесса. В результате будет запущен новый бесплатный кластер с вашим Simple Example matchmaker.

✅ Теперь вы можете перейти к следующему шагу.

2. Изучение конфигурации

По мере выпуска обновлений для Matchmaker каждая новая версия использует семантическое версионирование чтобы четко сообщать о влиянии изменений, интерпретируя формат major.minor.patch:

  • 🔥 major версии включают несовместимые изменения и требуют проверки интеграции,

  • 🌟 minor версии содержат значительные обратно-совместимые улучшения,

  • 🩹 patch версии содержат исправления ошибок и незначительные улучшения.

Включите inspect для билетов чтобы лучше понять и отладить возможные потоки матчмейкинга во время разработки. Мы рекомендуем отключать inspect API для вашего боевого matchmaker.

Некоторые развертывания могут привести к ошибкам. Мы пытаемся решить это, повторяя развертывание до max_deployment_retry_count раз автоматически (без подтверждения со стороны клиента).

Чтобы гарантировать, что неожиданные падения клиента или заброшенные билеты не будут висеть и занимать ресурсы matchmaker, билеты будут отменены через ticket_expiration_period изменив их статус на CANCELLED а затем окончательно удалены через ticket_removal_period .

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

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

  • имя по вашему выбору, например - размер матча,

  • тип правила, также известный как оператор, например - player_count,

  • и, наконец, атрибуты оператора, например team_count или max_team_size.

Правило количества игроков

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

  • team_count относится к числу команд, 1 команда может использоваться для кооперативного режима или режима каждый сам за себя,

  • min_team_size означает минимальное число игроков в команде.

  • max_team_size означает максимальное число игроков в команде.

Наш простой пример демонстрирует кооперативную игру на 2 игрока.

Правило задержек (Latencies Rule)

задержки это специальное правило, оптимизирующее пинг матчей игроков:

  • уменьшать задержку клиент-сервер, исключая регионы с высокой задержкой (выше порога),

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

Пример правила: маячки

маячки правило сконфигурировано с "difference": 100, "max_latency": 200 будет сопоставлять:

Элис и Боб могут быть в одной матче:

  • Токио отбрасывается (>200 мс),

  • задержки для Чикаго в пределах абсолютной разницы 100 мс.

Город-маячок
Матч
abs(A - B) [мс]
Элис [мс]
Боб [мс]

Чикаго

75.0

12.3

87.3

Лос-Анджелес

113.2

145.6

32.4

Токио

н/д

н/д

233.2

253.2

Элис и Чарли никогда не будут сопоставлены:

  • нет маячков с задержкой < 200 мс для обоих игроков,

  • Элис живёт в Северной Америке - Иллинойс,

  • Чарли живёт в Азии - Япония.

Город-маячок
Матч
abs(A - B) [мс]
Элис [мс]
Чарли [мс]

Чикаго

н/д

н/д

12.3

215.6

Лос-Анджелес

н/д

н/д

145.6

238.3

Токио

н/д

н/д

233.2

24.2

✅ Теперь вы можете перейти к следующему шагу.

3. Просмотрите детали экземпляра

☑️ Просмотрите детали вашего нового matchmaker в нашей панели управления после его инициализации:

  • Статус указывает состояние сервиса, может быть ONLINE, OFFLINE или ERROR.

  • Идентификатор помогает сотрудникам Edgegap быстро найти ваш matchmaker, если вам нужна помощь с устранением неполадок.

  • Дата запуска может быть полезна для отслеживания времени последнего обновления.

  • Размер соответствует одному из наших тарифных планов.

  • URL API будет использоваться игровыми клиентами и игровыми серверами для связи с вашим matchmaker.

  • Swagger URL — удобный графический интерфейс спецификации openAPI, который мы предоставляем для изучения схемы API.

  • Токен аутентификации — уникальный секретный токен, используемый игровыми клиентами и игровым сервером для аутентификации.

Чтобы протестировать ваш новый matchmaker, вам понадобятся Swagger URL, URL API и токен аутентификации.

✅ Теперь вы можете перейти к следующему шагу.

Чтобы обновить правила matchmaker в разработке, отредактируйте конфигурацию и перезапустите его.

4. Тестирование Tickets API

Пожалуйста, подождите до 5 минут после запуска matchmaker, чтобы позволить завершиться распространению DNS.

☑️ Сначала, откройте ваш Swagger URL чтобы просмотреть схему openAPI в интерфейсе swagger:

☑️ Нажмите Авторизоваться 🔒, вставьте ваш Токен аутентификации, и подтвердите, нажав Авторизоваться.

☑️ Прокрутите вниз до Ticket API - POST /tickets, разверните и нажмите Попробовать.

☑️ Предварительно просмотрите ваш запрос:

  • обратите внимание на player_ip установлен в null - это приведет к тому, что Matchmaker использует IP-адрес, автоматически добавленный в ваш запрос (см. Сервер-сервер для альтернатив),

  • profile относится к вашему Профили (Очереди),

  • attributes включают значения для правил вашего matchmaker, в данном случае для latencies правила,

    • rule player_count — это единственное правило, которое не требует никаких атрибутов в билетах игроков.

☑️ Нажмите Выполнить и просмотрите ответ на ваш запрос билета игрока:

☑️ Создайте второй билет, нажав Выполнить снова, так что наши два игрока совпадают и сервер запускается.

☑️ Сверните POST /tickets и откройте GET /tickets/{ticketId}, затем нажмите Попробовать.

☑️ Введите ID тикета из ответа на предыдущем шаге и нажмите Выполнить.

☑️ Просмотрите обновлённое назначение для вашего тикета игрока:

  • статус изменён на MATCH_FOUND сначала, сохраняя assignment установлен в null чтобы указать, что игроки совпали и сервер назначается,

☑️ Нажмите Выполнить снова, чтобы проверить ваш тикет, и просмотреть обновлённое назначение для вашего тикета:

  • статус изменён на HOST_ASSIGNED с assignment содержащим данные о назначенном сервере.

Устранение неполадок и FAQ

Мой тикет застрял в SEARCHING .

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


Мой тикет застревает, переключаясь между MATCH_FOUND и TEAM_FOUND повторно.

  • Аккаунты Free Tier ограничены одним деплоем одновременно. Пожалуйста, рассмотрите возможность обновления или остановите текущий деплой, чтобы начать новый.


Мой тикет сразу переходит в CANCELLED.

  • Срок действия вашего тикета истёк. Создайте новый тикет или увеличьте период истечения в вашей конфигурации для целей тестирования.


При проверке моего тикета я получаю HTTP 404 Not Found.

  • Ваш тикет был удалён либо посредством запроса DELETE, либо по истечении периода удаления (начинается после истечения срока тикета, определяется в вашей конфигурации). Создайте новый тикет или увеличьте периоды истечения/удаления в вашей конфигурации для тестирования.

☑️ Проверьте ваш новый деплой в нашей панели управления:

  • обратите внимание, что каждый деплой помечен всеми ID тикетов и профилем для лучшей отслеживаемости.

Через несколько секунд после нахождения матча участники переходят к status:HOST_ASSIGNED указывая, что ваш развертывание теперь готово и ваш игровой сервер инициализируется.

Каждый игрок читает свой ticket_id и назначение и пытается подключиться, используя FQDN (URL развертывания) и Внешний порт. Ваш игровой сервер в это время может всё ещё инициализироваться, поэтому игрокам необходимо несколько раз повторять попытку подключения, пока не будет превышено обычное время инициализации сервера:

Чтобы подключиться из PIE (редактор) в процессе разработки и тестирования нажмите клавишу тильда ~ и введите open {URL}:{port} и дождитесь, пока редактор загрузит карту.

Чтобы подключиться из сборки игрового клиента (и в рабочей производственной среде) попробуйте

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

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

☑️ Попробуйте подключиться с вашего игрового клиента к назначенному серверу.

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

✅ Теперь вы можете перейти к следующему шагу.

Найдите спецификацию openAPI для тестирования по адресу {matchmaker-url}/swagger/v1/swagger.json.

5. Интеграция игры

Matchmaker интегрируется с:

☑️ В Игровой клиент, мы рекомендуем предоставлять игрокам обновления статуса тикета через внутриигровой интерфейс для лучшего игрового опыта. См.:

☑️ В Игровой клиент, убедитесь, что вы обрабатываете повторяемые 429 Too Many Requests ошибки с экспоненциальной задержкой и повторной отправкой, давая matchmaker время восстановиться при резких всплесках трафика.

☑️ В Игровой клиент, убедитесь, что вы обрабатываете нерепортируемые ошибки:

  • 404 Not Found - тикет был удалён,

  • 500 Internal Server Error - временной сбой сервиса.

☑️ В Игровой сервер, читайте предпочтения игроков и начальный контекст сервера:

  1. Внедрённые переменные (Matchmaker) для получения исходных данных матчмейкинга игроков.

  2. Внедрённые переменные (Версии приложений) для параметров версий, настроек и секретов.

  3. Внедрённые переменные (Деплой) для информации о деплое, IP, местоположении и т. п.

Используйте GetEnvironmentVariable в C# или GetEnvironmentVariable в C++ чтобы получить значения переменных.

☑️ После подключения игроков, Игровой сервер и игровые клиенты запускают сцену загрузки — 3D-сцену, лобби-подобный социальный интерфейс или экран загрузки с индикатором прогресса, чтобы показать, что инициализация идёт.

☑️ Убедитесь, что ваш деплой будет остановлен правильно после окончания матча.

🙌 Поздравляем, вы завершили интеграцию Matchmaking! Чтобы узнать больше, продолжайте чтение.

🏁 Продвинутый пример

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

🏁 Продвинутый пример (полная конфигурация примера)
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "allowed_cors_origins": [
    "https://*.my-game-server.com"
  ],
  "profiles": {
    "advanced-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 125
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          },
          "selected_game_mode": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "elo_rating": {
              "max_difference": 150
            },
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "60": {
            "elo_rating": {
              "max_difference": 200
            }
          },
          "180": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            },
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    }
  }
}

🎾 Пользовательское лобби

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

🎾 Пример пользовательского лобби
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "custom-lobby-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "lobby_id": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}

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

🥛 Демонстрация Backfill

Опираясь на Матчмейкинг, эта конфигурация демонстрирует Backfill с Группы.

🥛 Пример конфигурации обратной заливки
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {}
      }
    }
  }
}

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

  • позволять новым игрокам присоединяться к уже идущим играм (друзьям или «рандомам»),

  • замещать игроков, которые покинули игру (леверы) после запуска сервера, чтобы избежать перезапуска матча,

  • позволять зрителям присоединяться и наблюдать турниры или матчи друзей (киберспорт),

  • централизовать игроков на больших серверах для обеспечения большего социального взаимодействия (MMO).

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

Визуализация сценариев бэкфилла

Шаги для завершения успешного бэкфилла:

  1. Сервер создаёт Подробный обзор для каждой команды отдельно, используя значения из:

    • Реальное назначение данные, полученные из Инжектируемые переменные (деплоймент).

    • Текущих подключённых игроков тикеты:

      • из Подробный обзор (matchmaker), предыдущих бэкфиллов assigned_ticket ответа или мок-данных, изменённых для соответствия конкретным игрокам,

      • заменять backfill_group_size значения с возможными размерами групп до доступной ёмкости,

  2. Клиенты игры создают новые Подробный обзор с backfill_group_size массив со значениями:

    • "1" если игрок ищет матчинг в одиночку.

    • "2" если игрок является частью группы подбора матчей с общей численностью 2 человека.

    • "new" если игроки разрешили запускать новые игры в дополнение к присоединению к уже идущим играм.

  3. Клиенты игры продолжают Подробный обзор и сопоставляют игроков с соответствующим бэкфиллом.

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

Чтобы создать профиль только для бэкфилла, установите min_team_size в 999999 и отключите сопоставления ticket + ticket.

🥛 Пример бэкфилла (Демонстрация бэкфилла)
🥛 Пример назначения бэкфилла (Демонстрация бэкфилла)

См. Управление зеркальными сидениями и Управление сидениями FishNet для мониторинг подключений игроков.

⚔️ Соревновательные игры

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

⚔️ Пример соревновательной игры
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "casual-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "180": {
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    },
    "competitive-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "versus_ranks": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

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

Режим игры
Количество команд
Размер команды
Всего игроков

5 на 5 FPS

2

5

10

5 на 5 MOBA

2

5

10

20×3 Королевская битва

20

3

60

10 человек Все против всех

1

10

10

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

  • Для всех матчей:

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

    • Подробный обзор для заранее собранных команд и чтобы не превышать размеры команд,

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

    • выделяйте больше CPU или памяти с разными Приложения и версии для конкретных профилей,

  • Для казуальных матчей:

    • опускайте ограничения по рангу, чтобы максимально ускорить подбор и заполнение матчей,

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

    • укажите размер группы для backfill, чтобы заменить ушедших игроков без превышения размеров команд,

    • удалите ограничения по задержке, чтобы гарантировать матч после 3 минут (180 с) времени в очереди.

  • Для соревновательных матчей:

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

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

  • Для топ-1% матчей с высоким уровнем мастерства (challengers):

    • используйте числовые рейтинги навыков (ELO) для тонкого контроля распределения навыков в матчах,

    • ждите дольше перед ослаблением требований по задержке из-за меньшего числа игроков.

🤝 Кооперативные игры

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

🤝 Пример кооперативной игры
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "cooperative-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_difficulty": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "player_level": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 10
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "player_level": {
              "max_difference": 20
            }
          },
          "60": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 4
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}

При количестве команд 1 и максимальном размере команды 4, требуется до 4 игроков на матч.

Определите несколько Профили (Очереди) для правил и настроек, специфичных для режимов игры:

  • начинайте с минимума в 4 игрока, чтобы удерживать игроков в очереди и максимизировать заполнение матчей,

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

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

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

  • ограничьте разницу в уровне игроков, чтобы требовать схожей степени прогресса в игре,

  • укажите размер группы для backfill, чтобы заменять ушедших без превышения ёмкости сервера,

  • используйте флаги модерации, чтобы отделять игроков с низкой репутацией и читеров от общей массы,

  • Подробный обзор для заранее собранных команд и чтобы заполнить команды без превышения ёмкости сервера,

  • выделяйте больше CPU или памяти, используя разные Приложения и версии для других профилей.

Начните с идеальных условий и расширяйте ограничения чтобы обеспечить быстрые матчи:

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

  • увеличивайте допустимую разницу уровней игроков, чтобы найти больше игроков,

  • уменьшайте минимальный размер команды, чтобы требовалось меньше игроков и игру можно было начать раньше,

    • сервер может заполнить пустые слоты ИИ-компаньонами,

    • или Подробный обзор чтобы добавить игроков позже,

  • установите минимальный размер команды равным 1, чтобы запустить игру соло после 150 с времени в очереди

🎈 Социальные игры

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

🎈 Пример социальной игры
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "social-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "attributes": {
              "team_count": 1,
              "min_team_size": 50,
              "max_team_size": 50
            },
            "type": "player_count"
          },
          "beacons": {
            "attributes": {
              "difference": 125,
              "max_latency": 150
            },
            "type": "latencies"
          },
          "selected_mode": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "15": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "match_size": {
              "team_count": 1,
              "min_team_size": 20,
              "max_team_size": 50
            }
          },
          "30": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 10,
              "max_team_size": 50
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 50
            }
          }
        }
      }
    }
  }
}

При количестве команд 1 (каждый сам за себя) и максимальном размере команды 50, требуется до 50 игроков на матч.

Определите Профили (Очереди) для правил и настроек, специфичных для режимов игры:

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

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

  • укажите размер группы для backfill, чтобы заменять ушедших без превышения ёмкости сервера,

  • используйте флаги модерации, чтобы отделять игроков с низкой репутацией и читеров от общей массы,

  • Подробный обзор для заранее созданных лобби или чтобы заполнить команды без превышения ёмкости сервера,

  • выделяйте больше CPU или памяти, используя разные Приложения и версии для других профилей.

Начните с идеальных условий и расширяйте ограничения чтобы обеспечить быстрые матчи:

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

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

    • сервер может заполнить пустые слоты ИИ-игроками,

    • или Подробный обзор чтобы добавить игроков позже,

  • установите минимальный размер команды равным 1, чтобы запустить игру соло после 150 с времени в очереди.

Последнее обновление

Это было полезно?