> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/learn/podbor-igrokov.md).

# Подбор игроков

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

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

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

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

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

{% hint style="success" %}
В качестве альтернативы, позвольте игрокам **выбрать постоянный (всегда онлайн) сервер** из списка с [Браузер серверов](/ru/learn/brauzer-serverov.md).
{% endhint %}

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

{% embed url="<https://youtu.be/HxtvzvJ1FTk>" %}

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

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

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

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

* [поняли модель развёртывания Edgegap](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-just-in-time-deployment-dedicated-servers),
* опубликовали ваше серверное приложение на Edgegap ([Unreal Engine](/ru/unreal-engine.md), [Unity](/ru/unity.md)),
* успешно подключились с игрового клиента к вашему серверу на Edgegap.

### Архитектура Matchmaking

Это руководство будет сосредоточено на **API Matchmaking и API Backfill**.

<figure><img src="/files/942c7a9826f3841bfdf97188ddb9026f1086cbc5" alt=""><figcaption></figcaption></figure>

При использовании matchmaking есть четыре (4) важных потока данных:

1. [API Matchmaking](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-api) **используется игровыми клиентами для связи с Matchmaker:**
   1. для управления группами, назначения серверов и мониторинга,
   2. для измерения пинга с помощью [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md).
2. [Развертывания](/ru/learn/orkestraciya/deployments.md) API используется для развертывания, масштабирования и управления вашими выделенными серверами с помощью Matchmaker.
3. [Транспорты Netcode](/ru/docs/sample-projects.md) используются для связи между игровыми клиентами и выделенными серверами.
4. [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) **чтобы заменить или добавить игроков на уже запущенный сервер.**

{% hint style="info" %}
После релиза, **ваш matchmaker должен будет работать 24/7** чтобы игроки по всему миру могли подключаться к серверам.
{% endhint %}

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

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

* создание экземпляра matchmaker в общем [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#hosting-cluster),
* определение правил и настроек в вашем matchmaker [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#configuration),
* проверка потока игрока и управление билетами с помощью [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-api).

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

☑️ [Зарегистрируйте бесплатную учетную запись Edgegap](https://app.edgegap.com/auth/register) и откройте [страницу панели Matchmaker](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

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

* имя matchmaker — для вашего удобства, например `quickstart-dev` ,
* загрузите нашу JSON-конфигурацию Simple Example.

🍀 **Simple Example (минимальная рекомендуемая конфигурация):**

{% hint style="danger" %}
**Обязательно измените** **`имя приложения`**  **и** **`версию`**  **чтобы они соответствовали вашему** [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md).
{% endhint %}

<pre class="language-json"><code class="lang-json">{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "simple-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "<a data-footnote-ref href="#user-content-fn-1">my-game-server</a>",
        "version": "<a data-footnote-ref href="#user-content-fn-2">2024.01.30-16.23.00-UTC</a>"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 2
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
</code></pre>

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

<details>

<summary><code>Конфигурация приложения недействительна для профиля XYZ.</code></summary>

* Мы не смогли найти ваш [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md), пожалуйста, проверьте `приложение`  значения.

</details>

<details>

<summary><code>Docker-образ для '2024.01.30-16.23.00-UTC' не кэширован.</code></summary>

[**🌟 Обновитесь до тарифа Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **чтобы разблокировать** [**мгновенные развёртывания с кэшированием**](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-1.-start-a-deployment)**.**

* Некэшированные образы размером 4 ГБ и более могут дольше развёртываться, что приведёт к [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error "mention"). Рассмотрите возможность оптимизации размера образа сервера ([Unreal Engine](/ru/unreal-engine.md#optimize-server-build-size) / [Unity](/ru/unity.md#optimize-server-build-size)).
* Вы всё равно можете продолжить, хотя мы рекомендуем протестировать время развёртывания.

</details>

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

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

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

По мере выпуска обновлений Matchmaker каждая новая версия использует [семантическое версионирование](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#changelog) чтобы ясно сообщать о влиянии изменений, используя формат `major.minor.patch`:

* 🔥 `мажорные` версии содержат несовместимые изменения и требуют проверки интеграции,
* 🌟 `минорные` версии включают значительные обратно совместимые улучшения,
* 🩹 `патч` версии включают исправления ошибок и небольшие улучшения.

[Проверяйте тикеты](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-api) чтобы лучше понимать и отлаживать возможные потоки matchmaking в процессе разработки. Мы рекомендуем отключить API инспекции для вашего production matchmaker.

**Некоторые** [**развертывания могут завершиться ошибками**](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-4.-deployment-error)**.** Мы пытаемся решить это, повторяя развертывание до `max_deployment_retry_count` раз автоматически (без подтверждения клиента).

Чтобы неожиданные сбои клиента или брошенные тикеты не оставались надолго и не занимали ресурсы вашего matchmaker, несопоставленные тикеты будут отменены через `ticket_expiration_period` в результате чего их статус изменится на `ОТМЕНЕНА` а затем окончательно удалены через `ticket_removal_period` .

{% hint style="info" %}
[Узнайте, как matchmaker максимизирует заполнение матчей и сокращает время ожидания в очереди до менее чем 10 секунд.](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#find-match)
{% endhint %}

Ядро нашей логики matchmaking настраивается в [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles). Каждый профиль — это полностью изолированная очередь matchmaking, указывающая на [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) с предопределенным количеством требуемых ресурсов CPU и памяти (RAM).

[Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-rules) в начальном наборе правил должны быть выполнены, чтобы игроки были сгруппированы вместе; каждое правило определяется тремя свойствами:

* имя на ваш выбор, например - `размер матча`,
* тип правила, также известный как оператор, например - `player_count`,
* и, наконец, атрибуты оператора, например `team_count` или `max_team_size`.

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

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

* `team_count` относится к количеству команд; 1 команда может использоваться для кооперативных режимов или режимов free-for-all,
* `min_team_size` относится к минимальному числу игроков в команде.
* `max_team_size` относится к максимальному числу игроков в команде.

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

{% hint style="warning" %}
правило количества игроков **обязательно и может быть определено только один раз** в ваших начальных правилах конфигурации.
{% endhint %}

**Правило задержек**

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

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

<details>

<summary>Пример правила: <code>маяки</code></summary>

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

:white\_check\_mark: Алиса и Боб могут быть сопоставлены:

* Токио отбрасывается (>200 мс),
* задержка для Чикаго в пределах абсолютной разницы 100 мс.

<table><thead><tr><th width="180">Город маяка</th><th width="80">Матч</th><th width="132">abs(A - B) [мс]</th><th width="164">Алиса [мс]</th><th width="164">Боб [мс]</th></tr></thead><tbody><tr><td>Чикаго</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>75.0</td><td>12.3</td><td>87.3</td></tr><tr><td>Лос-Анджелес</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-3">113.2</a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>145.6</td><td>32.4</td></tr><tr><td><del>Токио</del></td><td>н/д</td><td>н/д</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><a data-footnote-ref href="#user-content-fn-4"><del>253.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr></tbody></table>

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

* нет маяков с задержкой < 200 мс для обоих игроков,
* Алиса живет в Северной Америке — Иллинойс,
* Чарли живет в Азии — Япония.

<table><thead><tr><th width="180">Город маяка</th><th width="80">Матч</th><th width="132">abs(A - B) [мс]</th><th width="164">Алиса [мс]</th><th width="164">Чарли [мс]</th></tr></thead><tbody><tr><td><del>Чикаго</del></td><td>н/д</td><td>н/д</td><td>12.3</td><td><a data-footnote-ref href="#user-content-fn-4"><del>215.6</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Лос-Анджелес</del></td><td>н/д</td><td>н/д</td><td>145.6</td><td><a data-footnote-ref href="#user-content-fn-4"><del>238.3</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td></tr><tr><td><del>Токио</del></td><td>н/д</td><td>н/д</td><td><a data-footnote-ref href="#user-content-fn-4"><del>233.2</del></a> <span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td>24.2</td></tr></tbody></table>

</details>

{% hint style="warning" %}
Правило `задержки`  — это **является необязательным и может быть определено только один раз в вашей начальной конфигурации** правила.
{% endhint %}

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

### 3. Проверьте сведения об экземпляре

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

<figure><img src="/files/779029d9558b394ee98ab70a654a7f22b62ba1e7" alt=""><figcaption></figcaption></figure>

* **Статус** указывает на состояние сервиса и может быть ONLINE, OFFLINE или ERROR.
* **Идентификатор** помогает сотрудникам Edgegap быстро найти ваш matchmaker, если вам понадобится помощь в устранении неполадок.
* **Запущен в** может быть полезно для отслеживания времени последнего обновления.
* **Размер** соответствует одному из наших [тарифных планов](https://edgegap.com/resources/pricing#matchmaker).
* **URL API** будет использоваться игровыми клиентами и игровыми серверами для связи с вашим matchmaker.
* **URL Swagger** — это удобный графический интерфейс для спецификации OpenAPI, который мы предоставляем для изучения схемы API.
* **Токен авторизации** — это уникальный секретный токен, используемый игровыми клиентами и игровым сервером для аутентификации.

{% hint style="danger" %}
**Сотрудники Edgegap никогда не будут запрашивать ваши токены. Пересоздайте токен, если подозреваете нарушение безопасности.**
{% endhint %}

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

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

{% hint style="info" %}
Чтобы обновить правила вашего matchmaker в процессе разработки, отредактируйте конфигурацию и перезапустите его.
{% endhint %}

{% hint style="success" %}
См. [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#rolling-updates-and-ab-tests) для живых игр и обновлений без простоя.
{% endhint %}

### 4. Проверьте API тикетов

{% hint style="info" %}
**Пожалуйста, подождите до 5 минут** после запуска вашего matchmaker, чтобы завершилось распространение DNS.
{% endhint %}

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

<figure><img src="/files/4987495b4df16b97cabfbaa59245903b450c7830" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/aa2cc80c0190940a0cd151e76f622e4d52f77d3e" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/5c2958ecf5ca413d5d60a504f4c9fc95d4538e4a" alt=""><figcaption></figcaption></figure>

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

* обратите внимание `player_ip` установлено в `null` - это заставит Matchmaker использовать IP-адрес, автоматически добавленный в ваш запрос (см. [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#server-to-server-api) для альтернатив),
* `profile` относится к вашему [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles),
* `attributes` включите значения для правил вашего matchmaker; в данном случае для `латентности` правила,
  * правило `player_count` — это единственное правило, которое не требует никаких атрибутов в билетах игроков.

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

* `id` — это ваш уникальный ID билета matchmaking; сохраните его, чтобы позже проверить тикет,
* `profile` подтверждая выбор [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles),
* `group_id` — это уникальный [ID группы, присваиваемый каждому тикету; одиночный игрок представляется как группа из 1](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up),
* `team_id` — это уникальный ID команды, выдаваемый каждому игроку один раз `КОМАНДА НАЙДЕНА` достигается статус,
  * [каждая команда может содержать несколько групп, не превышая настроенный размер команды](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-rules),
* `player_ip` — это определенный публичный IP-адрес игрока, независимо от метода идентификации,
* `назначение` установлено в `null` чтобы указать, что тикет не был сопоставлен или назначен на сервер,
* `created_at` предоставляет информацию о том, когда был создан тикет игрока, для использования в игровом интерфейсе,
* `статус` указывает текущий статус тикета; все тикеты начинаются в `ПОИСК` .

<figure><img src="/files/03b6833f16ff678ed63491f0b767941dd67de910" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="/files/55180dc7babfb40b320dde049e93026227f2366a" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="/files/180d4823be31ca74d904b0c17552ec6f69170da1" alt=""><figcaption></figcaption></figure>

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

* статус изменился на `HOST_ASSIGNED` с `назначение` содержащий сведения о назначенном сервере.

<figure><img src="/files/9c5704ae26b6d1416083d01b5db16387249fe38c" alt=""><figcaption></figcaption></figure>

<details>

<summary>Устранение неполадок и FAQ</summary>

Моя заявка застряла в `ПОИСК` .

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

***

Моя заявка застряла, переключаясь между `MATCH_FOUND` и `КОМАНДА НАЙДЕНА` многократно.

* Учетные записи Free Tier ограничены 1 развертыванием одновременно. Рассмотрите возможность апгрейда или остановите текущее развертывание, чтобы запустить новое.

***

Моя заявка сразу переходит в `ОТМЕНЕНА`.

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

***

Я получаю HTTP 404 Not Found при проверке своего тикета.

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

</details>

☑️ [Просмотрите ваше новое развертывание на нашей панели управления](https://app.edgegap.com/deployment-management/deployments/list):

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

<figure><img src="/files/fab3ef8d3b7576d92ecc973033a5d8018070671f" alt=""><figcaption></figcaption></figure>

Через несколько секунд после нахождения совпадения участники переходят к `status:HOST_ASSIGNED`  что означает, что ваш [развертывание уже готово, а ваш игровой сервер инициализируется](https://docs.edgegap.com/ru/learn/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-3.-deployment-ready).

Каждый игрок читает свой `ticket_id`  и  `назначение`  и пытаются подключиться, используя [**FQDN**](#user-content-fn-5)[^5] **(URL развертывания)** и **внешний порт**. В этот момент ваш игровой сервер может все еще инициализироваться, поэтому **игрокам нужно повторять попытку подключения несколько раз**, пока не будет превышено обычное время инициализации сервера:

{% tabs %}
{% tab title="Unreal Engine" %}
Чтобы **подключение из PIE (редактора)** во время разработки и тестирования нажмите клавишу тильды `~`  и введите `open {URL}:{port}`  и дождитесь, пока редактор загрузит карту.

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

* Unreal Engine [⚡ Integration Kit](https://docs.edgegap.com/learn/unreal-engine-games/developer-tools#integration-kit):
  * [установить из Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (бесплатно для личного использования),
  * [импортировать простой пример blueprint](https://blueprintue.com/blueprint/m33u1okj/) и настроить под свои нужды.

{% hint style="success" %}
В случае неудачного подключения или черного экрана обратитесь к нашему [руководству по устранению неполадок](/ru/unreal-engine.md#troubleshooting-and-faq).
{% endhint %}
{% endtab %}

{% tab title="Unity" %}
Чтобы **подключите ваш Unity Editor** или **игровой клиент** к вашему облачному развертыванию, укажите:

* **Развертывание** **URL** указывающий на IP-адрес сервера, обычно в `NetworkManager` компоненте.
* **внешний порт** сопоставленный с [внутренним портом прослушивания сервера](/ru/learn/orkestraciya/application-and-versions.md#port-mapping), обычно в компоненте Transport.

{% hint style="success" %}
В случае тайм-аута подключения или других проблем обратитесь к нашему [руководству по устранению неполадок](/ru/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Мы не просим игроков подтверждать матч, поскольку стремимся обеспечить как можно более короткое время до начала игры, высокий процент заполнения матчей и минимизировать уклонение от очереди и отмены матчей.
{% endhint %}

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

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

{% hint style="warning" %}
Если у вас высокая задержка, возможно, ваша интеграция netcode настроена на имитацию сетевой задержки. **Отключите VPN при тестировании** для более реалистичных условий и получите [развертывание с низкой задержкой](/ru/learn/orkestraciya/deployments.md#server-placement).
{% endhint %}

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

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

{% hint style="info" %}
Найдите спецификацию OpenAPI для тестирования по адресу `{matchmaker-url}/swagger/v1/swagger.json`.
{% endhint %}

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

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

* **Игровой клиент**, чтобы [управлять группами, участниками, назначениями и тикетами](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up),
* **Выделенный сервер**, чтобы [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) после выхода игрока.

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

* Unity [Инструменты разработчика](/ru/unity/developer-tools.md#software-development-kit):
  * [установите пакет бесплатно с помощью Unity Package Manager](https://github.com/edgegap/edgegap-unity-sdk),
  * [изучите наше руководство для начала работы и полные примеры](/ru/unity/podbor-igrokov.md).
* Unreal Engine [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit):
  * [прочитать документацию](https://egik.betide.studio/) от Betide Studios,
  * [установить из Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (бесплатно для личного использования),
  * [импортировать простой пример blueprint](https://blueprintue.com/blueprint/m33u1okj/) (сопоставление игроков) и настроить под свои нужды.

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

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

* `404 Not Found` - тикет был удален,
* `500 Internal Server Error` - временный сбой сервиса.

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

1. [Внедренные переменные (Matchmaker)](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#injected-environment-variables) **чтобы получить начальные данные matchmaking игроков.**
2. [Внедренные переменные (версии приложения)](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional) для параметров версии, настроек и секретов.
3. [Внедренные переменные (развертывание)](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) для информации о развертывании, IP, местоположении и т. д...

{% hint style="info" %}
Используйте [GetEnvironmentVariable в C#](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) или [GetEnvironmentVariable в C++](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable) чтобы получить значения переменных.
{% endhint %}

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

☑️ Убедитесь, что ваше [развертывание будет остановлено](https://docs.edgegap.com/docs/deployment#stop-a-deployment) корректно после завершения матча.

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

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

Полноценная конфигурация, использующая все возможности matchmaking, включая [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles), [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-rules)и [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#rule-expansion) может выглядеть так:

<details>

<summary>🏁 Расширенный пример (полная конфигурация примера)</summary>

```json
{
  "version": "3.2.5",
  "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
            }
          }
        }
      }
    }
  }
}
```

</details>

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

Основано на [#simple-example](#simple-example "mention"), эта конфигурация демонстрирует [Backfill](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) с [Группы](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up).

<details>

<summary><span data-gb-custom-inline data-tag="emoji" data-code="1f95b">🥛</span> Пример конфигурации Backfill</summary>

```json
{
  "version": "3.2.5",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "30s",
      "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": {}
      }
    }
  }
}
```

</details>

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

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

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

{% hint style="warning" %}
[Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) для замены сессий Seat/Match. Matchmaker поддерживает только сессию Default.
{% endhint %}

<figure><img src="/files/39d6a1014be11c05325f3f774ba8a221dd36281b" alt=""><figcaption><p>Визуализация сценариев Backfill</p></figcaption></figure>

{% hint style="success" %}
**Backfill игнорируют** `player_count`  **правило и всегда сопоставляют ровно одну группу**. `backfill_group_size`  управляет вместимостью команды по стратегии round-robin, равномерно заполняя команды контролируемым образом.
{% endhint %}

**Чтобы успешно выполнить backfill, нужно:**

1. Сервер создаёт один Backfill для каждой команды, которой не хватает игроков, используя значения из:
   * Реальные `назначение`  данные, полученные из [Развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) (развёртывания).
   * Текущих подключённых игроков' `тикеты`:
     * из [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#injected-variables) (matchmaker), предыдущих backfill' `assigned_ticket` ответа или тестовых данных, изменённых для соответствия конкретным игрокам,
     * замените `backfill_group_size`  значения на возможные размеры групп [до доступной вместимости](#user-content-fn-6)[^6],
2. Игровые клиенты создают новые тикеты (участия) и включают `backfill_group_size`  значения:
   * `"1"`  если игрок подбирается в матч в одиночку.
   * [`"2"`  если игрок является частью группы подбора с 2x участниками всего](#user-content-fn-7)[^7].
   * `"new"`  если игроки разрешили запуск новых игр в дополнение к присоединению к уже идущим играм.
3. Игровые клиенты переходят к [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#find-match) и сопоставляют игроков с соответствующим backfill.
4. Если группа, пополненная через backfill, не полностью заполнила команду, сервер может повторить этот процесс с тикетами новых игроков, добавленных через backfill, чтобы добавить ещё игроков и достичь нужного размера команды.

{% hint style="success" %}
Backfill игнорируют правила размера команды и всегда сопоставляют 1× backfill с 1× группой. **Чтобы сопоставлять только с backfill и отключить подбор с другими игроками в очереди, установите `min_team_size: 999999` .**
{% endhint %}

<details>

<summary>🥛 Пример Backfill (демонстрация Backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributes": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Монреаль",
        "country": "Канада",
        "continent": "Северная Америка",
        "administrative_division": "Квебек",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributes": {
        "beacons": {
          "Нью-Йорк": 12.2,
          "Лос-Анджелес": 45.3,
          "Париж": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "attributes": {
        "beacons": {
          "Нью-Йорк": 21.0,
          "Лос-Анджелес": 30.2,
          "Париж": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": null
}
```

</details>

<details>

<summary>🥛 Пример назначения Backfill (демонстрация Backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributes": {
    "assignment": {
      "request_id": "cd28e6c66554",
      "fqdn": "cd28e6c66554.pr.edgegap.net",
      "public_ip": "192.168.2.14",
      "ports": {
        "game": {
          "internal": 7777,
          "external": 56890,
          "link": "cd28e6c66554.pr.edgegap.net:56890",
          "protocol": "UDP"
        },
        "web": {
          "internal": 22,
          "external": 57440,
          "link": "cd28e6c66554.pr.edgegap.net:57440",
          "protocol": "TCP"
        },
        "server": {
          "internal": 80,
          "external": 50110,
          "link": "cd28e6c66554.pr.edgegap.net:50110",
          "protocol": "TCP"
        }
      },
      "location": {
        "city": "Монреаль",
        "country": "Канада",
        "continent": "Северная Америка",
        "administrative_division": "Квебек",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributes": {
        "beacons": {
          "Нью-Йорк": 12.2,
          "Лос-Анджелес": 45.3,
          "Париж": 78.3
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "192bb97e-7fd6-4d86-8ce4-61c53c9fef16",
      "id": "c3d057h5h6f7j889fk43",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    },
    "cqg0bg9583s738h9dkf6": {
      "player_ip": "217.34.85.142",
      "attributes": {
        "beacons": {
          "Нью-Йорк": 21.0,
          "Лос-Анджелес": 30.2,
          "Париж": 101.1
        },
        "backfill_group_size": [
          "2",
          "1"
        ]
      },
      "group_id": "aea7df3c-d391-4ea3-a3ec-dded422fe7c8",
      "id": "cqg0bg9583s738h9dkf6",
      "created_at": "2024-08-20T13:38:05.251393+00:00"
    }
  },
  "assigned_ticket": {
    "profile": "backfill-example",
    "player_ip": "244.13.201.244",
    "attributes": {
      "beacons": {
        "Нью-Йорк": 30.2,
        "Лос-Анджелес": 10.5,
        "Париж": 123.9
      },
      "backfill_group_size": [
        "new",
        "1"
      ]
    },
    "id": "cqg0bg550h7uujd77khg",
    "group_id": "e0cf41c0-f88f-456e-a032-03b1d6821a9a",
    "created_at": "2024-08-20T13:38:08.251393+00:00",
    "status": "HOST_ASSIGNED"
  }
}
```

</details>

{% hint style="info" %}
См. [Управление местами Mirror Seat](https://docs.edgegap.com/docs/sample-projects/mirror-on-edgegap#bonus-seat-sessions-management) и [Управление местами FishNet Seat](https://docs.edgegap.com/docs/sample-projects/fishnet-on-edgegap#bonus-seat-sessions-management) для **мониторинг подключений игроков**.
{% endhint %}

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

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

<details>

<summary>⚔️ Пример соревновательной игры</summary>

```json
{
  "version": "3.2.5",
  "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
            }
          }
        }
      }
    }
  }
}
```

</details>

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

<table><thead><tr><th width="300">Режим игры</th><th>Количество команд</th><th>Размер команды</th><th>Всего игроков</th></tr></thead><tbody><tr><td>FPS 5 на 5</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>MOBA 5 на 5</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>Королевская битва 20x3</td><td>20</td><td>3</td><td><strong>60</strong></td></tr><tr><td>10 игроков free for all</td><td>1</td><td>10</td><td><strong>10</strong></td></tr></tbody></table>

Определите несколько [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для режима игры, и [расширяйте по мере необходимости](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#rule-expansion).

* **Для всех матчей:**
  * ограничьте [задержку matchmaking](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять далеко находящихся игроков,
  * [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up) для заранее собранных групп и чтобы не превышать размеры команд,
  * постепенно ослабляйте ограничения по задержке со временем, чтобы находить больше игроков,
  * выделяйте больше CPU или памяти с помощью разных [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для определенных профилей,
* **Для казуальных матчей:**
  * уберите ограничения по рангу, чтобы максимально увеличить скорость подбора и заполнение матча,
  * позвольте игрокам указывать предпочтения по карте, чтобы найти карту, подходящую всем,
  * укажите размер группы для backfill, чтобы заменять вышедших игроков, не превышая размер команд,
  * снимите ограничения по задержке, чтобы гарантировать матч после 3 минут (180 с) ожидания в очереди.
* **Для соревновательных матчей:**
  * ограничьте ранг, чтобы допускать только соперников схожего уровня навыка,
  * используйте ранги повышения или понижения, чтобы сопоставлять игроков на крайних уровнях рангов лиги.
* **Для топ-1% матчей высокого уровня навыка (challengers):**
  * используйте числовые рейтинги навыка (ELO), чтобы получить точный контроль над распределением навыка в матчах,
  * дольше ждите перед ослаблением требований к задержке из-за меньшего количества игроков.

{% hint style="success" %}
Использование нескольких профилей для **разделения казуальных режимов, соревновательных режимов и игроков высшего уровня challengers** позволяет отдельно настраивать правила и расширения для каждого типа игроков.
{% endhint %}

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

Кооперативные игры требуют, чтобы игроки работали вместе как команда ради общей цели или против ИИ-соперника. Объединяйте игроков со схожими предпочтениями и стилем игры. Заменяйте вышедших игроков и улучшайте [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md#connection-quality) чтобы обеспечить отзывчивый игровой опыт.

<details>

<summary>🤝 Пример кооперативной игры</summary>

```json
{
  "version": "3.2.5",
  "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
            }
          }
        }
      }
    }
  }
}
```

</details>

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

Определите несколько [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для режимов игры:

* начинайте минимум с 4 игроков, чтобы удерживать игроков в очереди и максимизировать заполнение матча,
* ограничьте [задержку matchmaking](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять далеко находящихся игроков,
* позвольте игрокам выбирать определенную сложность игры, чтобы она подходила уровню навыка каждого,
* позвольте игрокам указывать предпочтения по карте, чтобы найти карту, подходящую всем,
* ограничьте разницу в уровнях игроков, чтобы требовать схожую степень прогресса в игре,
* укажите размер группы для backfill, чтобы заменять вышедших игроков, не превышая емкость сервера,
* используйте флаги модерации, чтобы отделять игроков с низкой кармой и читеров от общей аудитории,
* [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up) для заранее собранных групп и заполнения команд без превышения емкости сервера,
* выделяйте больше CPU или памяти, используя разные [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для других профилей.

Начните с идеальных условий и [расширяйте ограничения](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#rule-expansion) чтобы обеспечить быстрый подбор:

* со временем ослабляйте ограничения по задержке, чтобы находить больше игроков,
* увеличьте допустимую разницу уровней игроков, чтобы находить больше игроков,
* уменьшите минимальный размер команды, чтобы требовалось меньше игроков и игра начиналась раньше,
  * сервер может заполнить пустые слоты ИИ-напарниками,
  * или [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) чтобы добавить игроков позже,
* установите минимальный размер команды 1, чтобы запустить игру в одиночку после 150 с ожидания в очереди.

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

Социальные игры сосредоточены на построении связей и отношений между игроками через сотрудничество, общение и общий опыт. Поддерживайте большое число игроков, максимизируйте заполнение матча и учитывайте предпочтения игроков и игровые привычки. Заменяйте вышедших игроков и обеспечьте высокий [Пинг-маяки](/ru/learn/orkestraciya/ping-beacons.md#connection-quality) чтобы обеспечить отзывчивый игровой опыт.

<details>

<summary>🎈 Пример социальной игры</summary>

```json
{
  "version": "3.2.5",
  "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
            }
          }
        }
      }
    }
  }
}
```

</details>

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

Определите [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#matchmaking-profiles) для правил и настроек, специфичных для режимов игры:

* ограничьте [задержку matchmaking](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#ping-optimization) чтобы не сопоставлять далеко находящихся игроков,
* позвольте игрокам указывать предпочтения по режиму игры и находить режим, подходящий всем,
* укажите размер группы для backfill, чтобы заменять вышедших игроков, не превышая емкость сервера,
* используйте флаги модерации, чтобы отделять игроков с низкой кармой и читеров от общей аудитории,
* [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#group-up) для заранее собранных лобби или заполнения команд без превышения емкости сервера,
* выделяйте больше CPU или памяти, используя разные [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#app-versions) для других профилей.

Начните с идеальных условий и [расширяйте ограничения](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#rule-expansion) чтобы обеспечить быстрый подбор:

* со временем ослабляйте ограничения по задержке, чтобы находить больше игроков,
* постепенно уменьшайте минимальный размер команды, чтобы требовалось меньше игроков и игра начиналась раньше,
  * сервер может заполнить пустые слоты ИИ-игроками,
  * или [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#backfill-match) чтобы добавить игроков позже,
* установите минимальный размер команды 1, чтобы запустить игру в одиночку после 150 с ожидания в очереди.

[^1]: замените на собственное имя приложения

[^2]: замените на собственную версию приложения

[^3]: превышена максимальная разница

[^4]: превышена максимальная задержка

[^5]: Fully Qualified Domain Name

[^6]: например, для 3 свободных слотов = \["3", "2", "1"]

[^7]: замените "2" на число фактических участников группы
