> 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/fr/learn/matchmaking.md).

# Matchmaking

Démarrez rapidement avec le matchmaking et explorez des scénarios d’exemple pour divers genres.

Le matchmaking dans les jeux basés sur des matchs vise généralement à :

* **trouver d'autres joueurs** en fonction de critères tels que la région, la latence, le niveau, ou les paramètres du jeu ;
* **rechercher des serveurs** pour rejoindre en fonction de la capacité disponible \[ou du ping, de la région, du niveau, de la carte, du mode] ;
* **démarrer un nouveau serveur** si les serveurs existants sont pleins ou ne répondent pas aux critères des joueurs.

L'expérience du joueur passe avant tout, définissant nos objectifs principaux :

* taux de remplissage des matchs élevé et intégration des fonctionnalités sociales (jouer avec des amis en groupe),
* matchs rapides avec qualité de match contrôlée (faible latence, préférences partagées),
* processus de matchmaking fiable et prévisible avec une disponibilité mondiale.

{% hint style="success" %}
Alternativement, laissez les joueurs **choisir un serveur persistant (toujours en ligne)** d'une liste avec [Navigateur de serveurs](/fr/learn/navigateur-de-serveurs.md).
{% endhint %}

Suivez cette vidéo pour commencer avec notre service Matchmaker :

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

## ✔️ Préparation

**Tester ce service est entièrement gratuit, aucune carte de crédit requise.**

Le niveau gratuit permet jusqu'à 3 heures d'exécution sur notre cluster de test partagé, après chaque redémarrage.

Ce tutoriel suppose que vous avez déjà :

* [compris le modèle de déploiement d'Edgegap](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-just-in-time-deployment-dedicated-servers),
* publié votre application serveur sur Edgegap ([Unreal Engine](/fr/unreal-engine.md), [Unity](/fr/unity.md)),
* connecté avec succès un client de jeu à votre serveur sur Edgegap.

### Architecture du matchmaking

Ce guide se concentrera sur **l’API de matchmaking et l’API de backfill**.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fp2QpL1MXYtwSWB2VJN2A%2Fimage.png?alt=media&amp;token=ecc73799-c2e6-4884-965f-48e4c125659c" alt=""><figcaption></figcaption></figure>

Il existe quatre (4) flux de données importants lorsque le matchmaking est impliqué :

1. [API de matchmaking](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-api) **est utilisée par les clients de jeu pour communiquer avec Matchmaker :**
   1. pour la gestion des groupes, l’attribution des serveurs et la surveillance,
   2. pour la mesure du ping avec [Balises de ping](/fr/learn/orchestration/ping-beacons.md).
2. [Déploiements](/fr/learn/orchestration/deployments.md) L’API est utilisée par Matchmaker pour déployer, dimensionner et gérer vos serveurs dédiés.
3. [Transports Netcode](/fr/docs/sample-projects.md) servent à communiquer entre les clients de jeu et les serveurs dédiés.
4. [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) **pour remplacer ou ajouter des joueurs à un serveur en cours d’exécution.**

{% hint style="info" %}
Après la mise en production, **votre matchmaker devra fonctionner 24 h/24, 7 j/7** afin que les joueurs du monde entier puissent rejoindre les serveurs.
{% endhint %}

## 🍀 Exemple simple

Commencez par un exemple simple et testez le flux de base des joueurs dans le matchmaking :

* création de l’instance du matchmaker sur le [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#hosting-cluster),
* définition des règles et des paramètres dans votre matchmaker [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#configuration),
* test du flux des joueurs et gestion des tickets avec [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-api).

### 1. Configuration sur l’offre gratuite

☑️ [Inscrivez-vous pour obtenir votre compte Edgegap gratuit](https://app.edgegap.com/auth/register) et ouvrez le [tableau de bord Matchmaker](https://app.edgegap.com/matchmaker-management-v2/matchmakers/list).

☑️ Cliquez sur **Créer Matchmaker** d’abord, puis saisissez :

* nom du matchmaker - pour votre référence personnelle, par ex. `quickstart-dev` ,
* téléchargez notre configuration JSON de l’exemple simple.

🍀 **Exemple simple (configuration minimale recommandée) :**

{% hint style="danger" %}
**Assurez-vous de modifier l’application** **`nom`**  **et** **`version`**  **pour correspondre à votre** [Applications et versions](/fr/learn/orchestration/application-and-versions.md).
{% endhint %}

<pre class="language-json"><code class="lang-json">{
  "version": "3.3.3",
  "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>

**Dépannage et FAQ :**

<details>

<summary><code>La configuration de l'application n'est pas valide pour le profil XYZ.</code></summary>

* Nous n'avons pas trouvé votre [Applications et versions](/fr/learn/orchestration/application-and-versions.md), veuillez vérifier `application`  valeurs.

</details>

<details>

<summary><code>L'image Docker pour '2024.01.30-16.23.00-UTC' n'est pas mise en cache.</code></summary>

[**🌟 Passez au niveau Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **pour débloquer** [**déploiements instantanés avec mise en cache**](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-1.-start-a-deployment)**.**

* Les images non mises en cache de plus de 4 Go peuvent prendre plus de temps à se déployer, entraînant [/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error "mention"). Envisagez d'optimiser la taille de votre image serveur ([Unreal Engine](/fr/unreal-engine.md#optimize-server-build-size) / [Unity](/fr/unity.md#optimize-server-build-size)).
* Vous pouvez procéder malgré tout, bien que nous recommandions de tester le temps de déploiement.

</details>

☑️ Si aucune erreur de validation n’apparaît, cliquez sur **Créer et démarrer** puis attendez la fin du processus. Cela lancera un nouveau cluster gratuit avec votre matchmaker de l’exemple simple.

✅ Vous pouvez maintenant passer à l'étape suivante.

### 2. Explorer la configuration

À mesure que nous publions des mises à jour de Matchmaker, chaque nouvelle version utilise [le versionnement sémantique](/fr/learn/matchmaking/matchmaker-in-depth.md#changelog) pour communiquer clairement l’impact des changements en interprétant le format `majeur.mineur.correctif`:

* 🔥 `majeur` les versions incluent des changements incompatibles et nécessitent une revue de l’intégration,
* 🌟 `mineur` les versions incluent des améliorations substantielles compatibles avec les versions précédentes,
* 🩹 `correctif` les versions incluent des corrections de bugs et des améliorations mineures.

[Inspecter les tickets](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-api) pour mieux comprendre et déboguer les flux de matchmaking possibles pendant le développement. Nous recommandons de désactiver l’API d’inspection pour votre matchmaker en production.

**Certains** [**déploiements peuvent entraîner des erreurs**](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-4.-deployment-error)**.** Nous essayons de résoudre cela en relançant le déploiement jusqu’à `max_deployment_retry_count` fois automatiquement (sans confirmation du client).

Afin d’éviter que des plantages client inattendus ou des tickets abandonnés ne persistent et n’occupent les ressources de votre matchmaker, les tickets non appariés seront annulés après `ticket_expiration_period` ce qui fera passer leur statut à `ANNULÉ` puis définitivement supprimés après `ticket_removal_period` .

{% hint style="info" %}
[Apprenez comment Matchmaker maximise le taux de remplissage des matchs et réduit les temps d’attente à moins de 10 secondes.](/fr/learn/matchmaking/matchmaker-in-depth.md#find-match)
{% endhint %}

Le cœur de notre logique de matchmaking est configuré dans [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles). Chaque profil est une file d’attente de matchmaking complètement isolée, pointant vers [Applications et versions](/fr/learn/orchestration/application-and-versions.md#app-versions) avec une quantité prédéfinie de ressources CPU et mémoire (RAM) requises.

[Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-rules) dans l’ensemble de règles initiales doivent être remplies pour que les joueurs soient regroupés, chacune définie par trois propriétés :

* nom de votre choix, par ex. - `taille du match`,
* type de règle, également appelé opérateur, par ex. - `player_count`,
* et enfin les attributs de l’opérateur, par ex. `team_count` ou `max_team_size`.

**Règle de nombre de joueurs**

Il s’agit d’une règle spéciale définissant combien de joueurs doivent correspondre pour lancer l’attribution :

* `team_count` fait référence au nombre d’équipes ; 1 équipe peut être utilisée pour les modes coopératifs ou chacun pour soi,
* `min_team_size` fait référence au nombre minimum de joueurs par équipe.
* `max_team_size` fait référence au nombre maximum de joueurs par équipe.

Notre exemple simple illustre un jeu coopératif à 2 joueurs.

{% hint style="warning" %}
règle de nombre de joueurs **est obligatoire et ne peut être définie qu’une seule fois** dans les règles de votre configuration initiale.
{% endhint %}

**Règle de latences**

**`latences`** est une règle spéciale optimisant le ping des matchs de joueurs :

* réduire la latence client-serveur en supprimant les régions à forte latence (au-dessus du seuil),
* améliorer l’équité des matchs en regroupant les joueurs ayant une latence similaire (en dessous de la différence).

<details>

<summary>Exemple de règle : <code>balises</code></summary>

`balises` règle configurée avec `"difference": 100, "max_latency": 200`  correspondra à :

:white\_check\_mark: Alice et Bob peuvent correspondre :

* Tokyo est écarté (>200 ms),
* la latence pour Chicago se situe dans une différence absolue de 100 ms.

<table><thead><tr><th width="180">Ville de la balise</th><th width="80">Correspondance</th><th width="132">abs(A - B) [ms]</th><th width="164">Alice [ms]</th><th width="164">Bob [ms]</th></tr></thead><tbody><tr><td>Chicago</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>Los Angeles</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>Tokyo</del></td><td>n/a</td><td>n/a</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: Alice et Charlie ne correspondront jamais :

* aucune balise n'a une latence < 200 ms pour les deux joueurs,
* Alice vit en Amérique du Nord - Illinois,
* Charlie vit en Asie - Japon.

<table><thead><tr><th width="180">Ville de la balise</th><th width="80">Correspondance</th><th width="132">abs(A - B) [ms]</th><th width="164">Alice [ms]</th><th width="164">Charlie [ms]</th></tr></thead><tbody><tr><td><del>Chicago</del></td><td>n/a</td><td>n/a</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>Los Angeles</del></td><td>n/a</td><td>n/a</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>Tokyo</del></td><td>n/a</td><td>n/a</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" %}
Règle `latences`  est **facultative et ne peut être définie qu’une seule fois dans votre configuration initiale** règles.
{% endhint %}

✅ Vous pouvez maintenant passer à l'étape suivante.

### 3. Examiner les détails de l’instance

☑️ Examinez les détails de votre nouveau matchmaker dans notre tableau de bord une fois initialisé :

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FY4Byy46pgEoXXmrtH92n%2Fimage.png?alt=media&amp;token=3fb5fd0e-526e-4f89-ac9a-9ee6809aeaf1" alt=""><figcaption></figcaption></figure>

* **Statut** indique l’état du service, peut être ONLINE, OFFLINE ou ERROR.
* **Identifiant** aide le personnel d’Edgegap à trouver rapidement votre matchmaker si vous avez besoin d’aide pour le dépannage.
* **Démarré à** peut être utile pour retrouver la dernière heure de mise à jour.
* **Taille** correspond à l’un de nos [niveaux tarifaires](https://edgegap.com/resources/pricing#matchmaker).
* **URL de l’API** sera utilisée par les clients de jeu et les serveurs de jeu pour communiquer avec votre matchmaker.
* **URL Swagger** est une interface graphique de spécification OpenAPI pratique que nous fournissons pour explorer le schéma de l’API.
* **Jeton d’authentification** est un jeton secret unique utilisé par les clients de jeu et le serveur de jeu pour l’authentification.

{% hint style="danger" %}
**Le personnel d’Edgegap ne vous demandera jamais vos jetons. Régénérez votre jeton si vous soupçonnez une faille de sécurité.**
{% endhint %}

Pour tester votre nouveau matchmaker, **vous aurez besoin de l’URL Swagger, de l’URL de l’API et du jeton d’authentification**.

✅ Vous pouvez maintenant passer à l'étape suivante.

{% hint style="info" %}
Pour mettre à jour les règles de votre matchmaker en développement, modifiez votre configuration et redémarrez-le.
{% endhint %}

{% hint style="success" %}
Voir [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#rolling-updates-and-ab-tests) pour les jeux en production et les mises à jour sans interruption.
{% endhint %}

### 4. Tester l’API des tickets

{% hint style="info" %}
**Veuillez attendre jusqu’à 5 minutes** après le démarrage de votre matchmaker afin de laisser le temps à la propagation DNS de se terminer.
{% endhint %}

☑️ Tout d’abord, **ouvrez votre URL Swagger** pour inspecter votre schéma OpenAPI dans l’interface Swagger :

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FyFErlc8rw9KHMOqloIUF%2Fimage.png?alt=media&amp;token=5a806adf-d644-4af6-b65e-9af82232bfcd" alt=""><figcaption></figcaption></figure>

☑️ Cliquez sur **Autoriser** 🔒, collez votre **Jeton d’authentification**, puis confirmez en cliquant sur **Autoriser**.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWnFM0p4UwDuo6Z5IOiUf%2Fimage.png?alt=media&amp;token=7cbdff75-7f6b-467c-8df3-fa568b846dac" alt=""><figcaption></figcaption></figure>

☑️ Faites défiler jusqu’à **API des tickets** **- POST /tickets**, développez et cliquez sur **Essayer**.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FpxA3FxrxhlelzSWvb5CO%2Fimage.png?alt=media&amp;token=8fc4fa97-44d5-48e3-8c02-c2dd49c6cd74" alt=""><figcaption></figcaption></figure>

☑️ Prévisualisez votre requête :

* remarquez `player_ip` défini sur `null` - cela fera en sorte que Matchmaker utilise l’adresse IP ajoutée automatiquement à votre requête (voir [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#server-to-server-api) pour les alternatives),
* `profil` fait référence à votre [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles),
* `attributes` incluez des valeurs pour les règles de votre matchmaker, dans ce cas pour la `latences` règle,
  * règle `player_count` est la seule règle qui ne nécessite aucun attribut dans les tickets des joueurs.

☑️ Cliquez sur **Exécuter** et examinez la réponse à votre demande de ticket joueur :

* `id` est l’identifiant unique de votre ticket de matchmaking ; conservez-le pour vérifier votre ticket plus tard,
* `profil` confirmant le choix de [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles),
* `group_id` est un [identifiant de groupe unique attribué à chaque ticket ; un joueur seul est représenté comme un groupe de 1](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up),
* `team_id` est un identifiant d’équipe unique attribué à chaque joueur une fois `TEAM_FOUND` lorsque le statut est atteint,
  * [chaque équipe peut contenir plusieurs groupes, sans dépasser la taille d’équipe configurée](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-rules),
* `player_ip` est l’adresse IP publique résolue du joueur, quelle que soit la méthode d’identification,
* `attribution` est définie sur `null` pour indiquer que le ticket n’a pas été apparié ni attribué à un serveur,
* `created_at` fournit des informations sur le moment où le ticket du joueur a été créé pour l’interface du jeu,
* `le statut` indique le statut actuel du ticket ; tous les tickets commencent en `SEARCHING` .

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FZauPhgT9t1roetX4yc7g%2Fimage.png?alt=media&amp;token=7834faf8-ce73-42dc-bae0-0293f05f1ea1" alt=""><figcaption></figcaption></figure>

☑️ Créez un deuxième ticket en appuyant sur **Exécuter** à nouveau, afin que nos deux joueurs soient appariés et qu’un serveur soit lancé.

☑️ Réduisez POST /tickets et ouvrez **GET /tickets/{ticketId}**, puis cliquez sur **Essayer**.

☑️ Saisissez l’identifiant du ticket provenant de la réponse de l’étape précédente et cliquez sur **Exécuter**.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FNznf5aHqhWefs77SFbzJ%2Fimage.png?alt=media&amp;token=1d04803c-fbe6-4a19-9ef7-f814ea87affe" alt=""><figcaption></figcaption></figure>

☑️ Examinez l’attribution mise à jour pour votre ticket joueur :

* statut passé à `MATCH_FOUND` d’abord, tout en gardant `attribution` défini sur `null` pour indiquer que les joueurs ont été appariés et qu’un serveur est en cours d’attribution,

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FGzBkyUepbqP71lFWG052%2Fimage.png?alt=media&amp;token=a0412446-cc4f-4070-a14c-fef79046f3f7" alt=""><figcaption></figcaption></figure>

☑️ Cliquez sur **Exécuter** à nouveau pour vérifier votre ticket, et consultez l’attribution mise à jour de votre ticket :

* statut passé à `HOST_ASSIGNED` avec `attribution` contenant les détails du serveur attribué.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWnbG4B1KFoxttkz5bALl%2Fimage.png?alt=media&amp;token=12a10044-2117-4a6d-845a-76c243231552" alt=""><figcaption></figcaption></figure>

<details>

<summary>Dépannage et FAQ</summary>

Mon ticket est bloqué en `SEARCHING` .

* Veuillez vérifier que vous avez créé suffisamment de tickets avec des critères se chevauchant et conformes à votre configuration.

***

Mon ticket est bloqué en alternant entre `MATCH_FOUND` et `TEAM_FOUND` de façon répétée.

* Les comptes de l’offre gratuite sont limités à 1 déploiement à la fois. Veuillez envisager une mise à niveau ou arrêter votre déploiement actuel pour en lancer un nouveau.

***

Mon ticket passe directement à `ANNULÉ`.

* Votre ticket a atteint son expiration. Recréez un nouveau ticket ou augmentez la période d’expiration dans votre configuration à des fins de test.

***

Je reçois HTTP 404 Not Found lors de la vérification de mon ticket.

* Votre ticket a été supprimé soit par une requête DELETE, soit en atteignant sa période de suppression (qui commence après l’expiration du ticket, définie dans votre configuration). Recréez un nouveau ticket ou augmentez les périodes d’expiration/de suppression dans votre configuration à des fins de test.

</details>

☑️ [Inspectez votre nouveau déploiement dans notre tableau de bord](https://app.edgegap.com/deployment-management/deployments/list):

* notez que chaque déploiement est étiqueté avec tous les identifiants de tickets et le profil pour une traçabilité accrue.

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FG4Ear9NrMHhgFH6T4ODB%2Fimage.png?alt=media&amp;token=acc9831c-a9d2-4eb2-8c39-c81b8e61ddd2" alt=""><figcaption></figcaption></figure>

Quelques secondes après avoir trouvé une correspondance, les adhésions passent à `status:HOST_ASSIGNED`  indiquant que votre [le déploiement est maintenant prêt et votre serveur de jeu est en cours d'initialisation](https://docs.edgegap.com/fr/learn/pages/5d7a2f9e0583a99d78071f1c4b8a7892a518534a#id-3.-deployment-ready).

Chaque joueur lit son `ticket_id`  et  `attribution`  et tente une connexion en utilisant le [**FQDN**](#user-content-fn-5)[^5] **(URL du déploiement)** et le **port externe**. Votre serveur de jeu est peut-être encore en cours d'initialisation à ce moment-là, donc **les joueurs doivent réessayer la connexion plusieurs fois**, jusqu’à dépasser votre temps d'initialisation habituel du serveur :

{% tabs %}
{% tab title="Unreal Engine" %}
Pour **se connecter depuis PIE (éditeur)** pendant le développement et les tests, appuyez sur la touche tilde `~`  et tapez `open {URL}:{port}`  et attendez que votre éditeur charge la carte.

Pour **se connecter depuis une compilation du client de jeu** (et dans un environnement de production réel) essayez

* Unreal Engine [⚡ Kit d'intégration](https://docs.edgegap.com/learn/unreal-engine-games/developer-tools#integration-kit):
  * [installer depuis le Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (gratuit pour un usage personnel),
  * [importer un blueprint d'exemple simple](https://blueprintue.com/blueprint/m33u1okj/) et l'adapter à vos besoins.

{% hint style="success" %}
En cas d'échec de connexion ou d'écran noir, consultez notre [guide de dépannage](/fr/unreal-engine.md#troubleshooting-and-faq).
{% endhint %}
{% endtab %}

{% tab title="Unity" %}
Pour **connecter votre éditeur Unity** ou **client de jeu** à votre déploiement cloud, saisissez :

* **Déploiement** **URL** pointant vers l'adresse IP du serveur, généralement dans `NetworkManager` composant.
* **Port externe** correspondant au [port d'écoute interne du serveur](/fr/learn/orchestration/application-and-versions.md#port-mapping), généralement dans un composant Transport.

{% hint style="success" %}
En cas de délai d'attente de connexion ou d'autres problèmes, consultez notre [guide de dépannage](/fr/unity.md#troubleshooting-and-faq-4).
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Nous ne demandons pas aux joueurs de confirmer la partie, car nous visons à fournir le temps d'accès au gameplay le plus court possible, un taux de remplissage des parties élevé, et à minimiser l'évitement de file d'attente et les annulations de partie.
{% endhint %}

Les clients de jeu doivent **enregistrer de façon persistante leur identifiant d’attribution entre les redémarrages du jeu**, afin qu’en cas de plantage du client de jeu, ils puissent récupérer les détails de connexion et tenter de se reconnecter.

☑️ Essayez de vous connecter depuis votre client de jeu au serveur attribué.

{% hint style="warning" %}
Si vous constatez une latence élevée, votre intégration Netcode peut être configurée pour simuler la latence réseau. **Désactivez le VPN lors des tests** pour des conditions plus réalistes et obtenir un [déploiement à faible latence](/fr/learn/orchestration/deployments.md#server-placement).
{% endhint %}

☑️ Une fois que vous avez vérifié que vous pouvez vous connecter à votre déploiement sans problème et que vous avez terminé les tests, **Arrêtez votre déploiement** afin de libérer de la capacité dans votre compte pour la prochaine build.

✅ Vous pouvez maintenant passer à l'étape suivante.

{% hint style="info" %}
Trouvez la spécification OpenAPI pour les tests à `{matchmaker-url}/swagger/v1/swagger.json`.
{% endhint %}

### 5. Intégration du jeu

Matchmaker s’intègre avec :

* **Client de jeu**, pour [gérer les groupes, les adhésions, les attributions et les tickets](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up),
* **Serveur dédié**, pour [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) après le départ d’un joueur.

☑️ Dans **Client de jeu**, nous recommandons de fournir aux joueurs des mises à jour du statut des tickets via l’interface en jeu pour la meilleure expérience possible. Voir :

* Unity [Outils pour développeurs](/fr/unity/developer-tools.md#software-development-kit):
  * [installer le package gratuitement via Unity Package Manager](https://github.com/edgegap/edgegap-unity-sdk),
  * [explorez notre guide de démarrage et des exemples complets](/fr/unity/matchmaking.md).
* Unreal Engine [Outils pour développeurs](/fr/unreal-engine/developer-tools.md#integration-kit):
  * [lisez la documentation](https://egik.betide.studio/) par Betide Studios,
  * [installez depuis Fab Marketplace](https://www.fab.com/listings/ff17ad88-12a1-49cf-9a41-31695ed11e16) (gratuit pour un usage personnel).

☑️ Dans **Client de jeu**, assurez-vous de gérer les erreurs réessayables `429 Trop de requêtes`  avec un backoff exponentiel et une nouvelle tentative, afin de laisser le temps au matchmaker de se rétablir lors de pics soudains de trafic.

☑️ Dans **Client de jeu**, assurez-vous de gérer les erreurs non réessayables :

* `404 Introuvable` - le ticket a été supprimé,
* `500 Erreur interne du serveur` - panne temporaire du service.

☑️ Dans **Serveur de jeu**, lisez les préférences des joueurs et le contexte initial du serveur :

1. [Variables injectées (Matchmaker)](/fr/learn/matchmaking/matchmaker-in-depth.md#injected-environment-variables) **pour récupérer les données initiales de matchmaking des joueurs.**
2. [Variables injectées (versions de l’application)](/fr/learn/orchestration/application-and-versions.md#other-parameters-optional) pour les paramètres de version, les réglages et les secrets.
3. [Variables injectées (déploiement)](/fr/learn/orchestration/deployments.md#injected-environment-variables) pour les informations de déploiement, l’IP, la localisation, etc...

{% hint style="info" %}
Utilisez [GetEnvironmentVariable en C#](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) ou [GetEnvironmentVariable en C++](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable) pour obtenir les valeurs des variables.
{% endhint %}

☑️ Une fois que les joueurs se connectent, **Serveur de jeu et clients de jeu** démarrez une scène de chargement - scène 3D, interface sociale de type lobby ou écran de chargement avec barre de progression, pour indiquer que l’initialisation progresse.

☑️ Assurez-vous que votre [déploiement sera arrêté](https://docs.edgegap.com/docs/deployment#stop-a-deployment) correctement une fois le match terminé.

🙌 Félicitations, vous avez terminé l’intégration du matchmaking ! Pour en savoir plus, poursuivez votre lecture.

## 🏁 Exemple avancé

Une configuration complète utilisant toutes les fonctionnalités de matchmaking, notamment [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles), [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-rules), et [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#rule-expansion) pourrait ressembler à ceci :

<details>

<summary>🏁 Exemple avancé (configuration d'exemple complète)</summary>

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

## 🥛 Démonstration de backfill

En s’appuyant sur [#simple-example](#simple-example "mention"), cette configuration présente [Backfill](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) avec [Groupes](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up).

<details>

<summary><span data-gb-custom-inline data-tag="emoji" data-code="1f95b">🥛</span> Exemple de configuration de backfill</summary>

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

En option, certains jeux peuvent avoir des besoins particuliers en matière de matchmaking, tels que :

* permettre aux nouveaux joueurs de rejoindre des parties en cours (amis ou « aléatoires »),
* remplacer les joueurs qui quittent la partie (quitteurs) après le démarrage du serveur afin d’éviter de relancer la partie,
* permettre aux spectateurs de rejoindre et d’observer des tournois ou les matchs d’amis (e-sport),
* centraliser les joueurs sur des serveurs plus grands pour offrir davantage d’interactions sociales (MMO).

Le backfill est un **ticket détenu par le serveur représentant les joueurs actuellement connectés au serveur.** Cela garantit que les joueurs ajoutés respecteront vos règles de matchmaking lorsqu’ils seront appariés avec les joueurs actuels.

{% hint style="warning" %}
[Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) pour remplacer les sessions Seat/Match. Matchmaker ne prend en charge que la session par défaut.
{% endhint %}

<figure><img src="https://3008966946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FJhdLAJYga4z2sjxLj6LM%2FUntitled-2024-10-29-1018.png?alt=media&amp;token=279136ba-a15e-46b0-a119-8419b8aca044" alt=""><figcaption><p>Scénarios de backfill visualisés</p></figcaption></figure>

{% hint style="success" %}
**Les backfills ignorent** `player_count`  **la règle, et correspondent toujours exactement à un seul groupe**. `backfill_group_size`  contrôle la capacité des équipes avec une stratégie en round-robin, en remplissant les équipes de manière uniforme et contrôlée.
{% endhint %}

**Les étapes pour réaliser un backfill réussi sont :**

1. Le serveur doit créer un Backfill par équipe manquant de joueurs, en utilisant les valeurs provenant de :
   * Réel `affectation`  données récupérées depuis [Déploiements](/fr/learn/orchestration/deployments.md#injected-environment-variables) (déploiement).
   * des joueurs actuellement connectés `tickets`:
     * depuis [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#injected-variables) (matchmaker), des backfills précédents' `assigned_ticket` réponse, ou des données simulées manipulées pour correspondre à des joueurs spécifiques,
     * remplacer `backfill_group_size`  les valeurs par des tailles de groupe possibles [jusqu’à la capacité disponible](#user-content-fn-6)[^6],
2. Les clients de jeu créent de nouveaux tickets (adhésions) et incluent `backfill_group_size`  valeurs :
   * `"1"`  si le joueur effectue le matchmaking seul.
   * [`"2"`  si le joueur fait partie d’un groupe de matchmaking comptant 2x membres au total](#user-content-fn-7)[^7].
   * `"nouveau"`  si les joueurs ont activé le démarrage de nouvelles parties en plus de rejoindre des parties en cours.
3. Les clients de jeu procèdent à [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#find-match) et associent les joueurs au backfill correspondant.
4. Si le groupe complété ne remplit pas entièrement l’équipe, le serveur peut répéter ce processus avec les tickets des joueurs nouvellement ajoutés via backfill, afin d’ajouter davantage de joueurs et d’atteindre les tailles d’équipe souhaitées.

{% hint style="success" %}
Les backfills ignorent les règles de taille d’équipe et associent toujours 1 backfill à 1 groupe. **Pour n’apparier qu’avec des backfills et désactiver l’appariement avec les autres joueurs dans la file d’attente, définissez `min_team_size: 999999` .**
{% endhint %}

<details>

<summary>🥛 Exemple de backfill (vitrine de backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributs": {
    "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": "Montréal",
        "country": "Canada",
        "continent": "Amérique du Nord",
        "administrative_division": "Québec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributs": {
        "balises": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 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",
      "attributs": {
        "balises": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 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>🥛 Exemple d’affectation de backfill (vitrine de backfill)</summary>

```json
{
  "profile": "backfill-example",
  "attributs": {
    "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": "Montréal",
        "country": "Canada",
        "continent": "Amérique du Nord",
        "administrative_division": "Québec",
        "timezone": "America/Toronto"
      }
    }
  },
  "tickets": {
    "c3d057h5h6f7j889fk43": {
      "player_ip": "174.25.48.238",
      "attributs": {
        "balises": {
          "New York": 12.2,
          "Los Angeles": 45.3,
          "Paris": 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",
      "attributs": {
        "balises": {
          "New York": 21.0,
          "Los Angeles": 30.2,
          "Paris": 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",
    "attributs": {
      "balises": {
        "New York": 30.2,
        "Los Angeles": 10.5,
        "Paris": 123.9
      },
      "backfill_group_size": [
        "nouveau",
        "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" %}
Voir [Gestion des sièges en miroir](https://docs.edgegap.com/docs/sample-projects/mirror-on-edgegap#bonus-seat-sessions-management) et [Gestion des sièges FishNet](https://docs.edgegap.com/docs/sample-projects/fishnet-on-edgegap#bonus-seat-sessions-management) pour **la surveillance des connexions des joueurs**.
{% endhint %}

## ⚔️ Jeux compétitifs

Les jeux compétitifs se concentrent sur des joueurs qui s’affrontent pour remporter la victoire, que ce soit en individuel (chacun pour soi) ou en équipes. Assurez des matchs équitables et équilibrés en associant des joueurs ou des équipes de niveaux de compétence similaires, et maintenez le rythme du jeu en trouvant rapidement des adversaires équitables.

<details>

<summary>⚔️ Exemple de jeu compétitif</summary>

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

Vous pouvez **définir plusieurs équipes avec 1 joueur ou plus chacune**, par exemple :

<table><thead><tr><th width="300">Mode de jeu</th><th>Nombre d’équipes</th><th>Taille de l’équipe</th><th>Nombre total de joueurs</th></tr></thead><tbody><tr><td>FPS 5v5</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>MOBA 5v5</td><td>2</td><td>5</td><td><strong>10</strong></td></tr><tr><td>Battle royale 20x3</td><td>20</td><td>3</td><td><strong>60</strong></td></tr><tr><td>Chacun pour soi 10 joueurs</td><td>1</td><td>10</td><td><strong>10</strong></td></tr></tbody></table>

Définissez plusieurs [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles) pour les règles et paramètres spécifiques au mode de jeu, et [développez selon les besoins](/fr/learn/matchmaking/matchmaker-in-depth.md#rule-expansion).

* **Pour tous les matchs :**
  * restreindre [la latence de matchmaking](/fr/learn/matchmaking/matchmaker-in-depth.md#ping-optimization) pour éviter de faire correspondre des joueurs éloignés,
  * [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up) pour les groupes préformés et éviter de dépasser la taille des équipes,
  * assouplir progressivement les restrictions de latence au fil du temps pour trouver plus de joueurs,
  * allouer davantage de CPU ou de mémoire avec différents [Applications et versions](/fr/learn/orchestration/application-and-versions.md#app-versions) pour des profils spécifiques,
* **Pour les matchs occasionnels :**
  * omettre les restrictions de rang pour maximiser la vitesse de mise en relation et le taux de remplissage des matchs,
  * laisser les joueurs indiquer leurs préférences de carte afin de trouver une carte adaptée à tout le monde,
  * préciser la taille du groupe de backfill pour remplacer les joueurs sortants sans dépasser la taille des équipes,
  * supprimer les limitations de latence pour garantir un match après 3 minutes (180 s) de temps d’attente.
* **Pour les matchs compétitifs :**
  * restreindre le rang pour n’autoriser que des adversaires de niveau similaire,
  * utiliser des rangs de montée ou de descente pour faire correspondre les joueurs aux extrêmes de rang de la ligue.
* **Pour le top 1 % des matchs de haut niveau (challengers) :**
  * utiliser des scores de compétence numériques (ELO) pour obtenir un contrôle fin de la répartition des niveaux dans les matchs,
  * attendre plus longtemps avant d’assouplir les exigences de latence en raison du faible nombre de joueurs.

{% hint style="success" %}
Utiliser plusieurs profils pour **séparer les modes de jeu occasionnels, compétitifs et les challengers de haut niveau** permet de personnaliser les règles et les extensions pour chaque type de joueur séparément.
{% endhint %}

## 🤝 Jeux coopératifs

Les jeux coopératifs exigent que les joueurs travaillent ensemble en équipe vers un objectif commun, ou contre un adversaire IA. Regroupez les joueurs aux préférences et habitudes de jeu similaires. Remplacez les joueurs qui quittent, et améliorez [Balises de ping](/fr/learn/orchestration/ping-beacons.md#connection-quality) afin d’offrir une expérience réactive aux joueurs.

<details>

<summary>🤝 Exemple de jeu coopératif</summary>

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

Avec un nombre d’équipes de 1 et une taille maximale d’équipe de 4, **exigez jusqu’à 4 joueurs par match**.

Définissez plusieurs [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles) pour les règles et paramètres spécifiques aux modes de jeu :

* commencez avec un minimum de 4 joueurs pour maintenir les joueurs en file d’attente et maximiser le taux de remplissage des matchs,
* restreindre [la latence de matchmaking](/fr/learn/matchmaking/matchmaker-in-depth.md#ping-optimization) pour éviter de faire correspondre des joueurs éloignés,
* laissez les joueurs choisir une difficulté de jeu particulière afin de convenir au niveau de compétence de chacun,
* laisser les joueurs indiquer leurs préférences de carte afin de trouver une carte adaptée à tout le monde,
* restreindre l’écart de niveau des joueurs afin d’exiger un degré de progression similaire,
* préciser la taille du groupe de backfill pour remplacer les joueurs sortants sans dépasser la capacité du serveur,
* utiliser des indicateurs de modération pour séparer les joueurs à faible karma et les tricheurs de la population générale,
* [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up) pour les groupes préformés et pour remplir les équipes sans dépasser la capacité du serveur,
* allouer davantage de CPU ou de mémoire à l’aide de différents [Applications et versions](/fr/learn/orchestration/application-and-versions.md#app-versions) pour d’autres profils.

Commencez avec les conditions idéales, puis [élargissez les restrictions](/fr/learn/matchmaking/matchmaker-in-depth.md#rule-expansion) pour garantir des matchs rapides :

* assouplir progressivement les restrictions de latence pour trouver plus de joueurs,
* augmenter l’écart de niveau autorisé des joueurs pour trouver plus de joueurs,
* réduire la taille minimale de l’équipe pour exiger moins de joueurs et lancer la partie plus tôt,
  * le serveur peut remplir les emplacements vides avec des coéquipiers IA,
  * ou [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) pour ajouter des joueurs plus tard,
* définissez la taille minimale de l’équipe à 1 pour lancer la partie en solo après 150 s de temps d’attente.

## 🎈 Jeux sociaux

Les jeux sociaux se concentrent sur la création de liens et de relations entre les joueurs par la collaboration, la communication et le partage d’expériences. Prenez en charge un grand nombre de joueurs, maximisez le taux de remplissage des matchs et alignez les préférences et habitudes de jeu des joueurs. Remplacez les joueurs qui quittent, et assurez un niveau élevé [Balises de ping](/fr/learn/orchestration/ping-beacons.md#connection-quality) afin d’offrir une expérience réactive aux joueurs.

<details>

<summary>🎈 Exemple de jeu social</summary>

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

Avec un nombre d’équipes de 1 (chacun pour soi) et une taille maximale d’équipe de 50, **exigez jusqu’à 50 joueurs par match**.

Définissez [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles) pour les règles et paramètres spécifiques aux modes de jeu :

* restreindre [la latence de matchmaking](/fr/learn/matchmaking/matchmaker-in-depth.md#ping-optimization) pour éviter de faire correspondre des joueurs éloignés,
* laissez les joueurs indiquer leurs préférences de mode de jeu et trouvez un mode adapté à tout le monde,
* préciser la taille du groupe de backfill pour remplacer les joueurs sortants sans dépasser la capacité du serveur,
* utiliser des indicateurs de modération pour séparer les joueurs à faible karma et les tricheurs de la population générale,
* [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#group-up) pour des salons préformés ou pour remplir les équipes sans dépasser la capacité du serveur,
* allouer davantage de CPU ou de mémoire à l’aide de différents [Applications et versions](/fr/learn/orchestration/application-and-versions.md#app-versions) pour d’autres profils.

Commencez avec les conditions idéales, puis [élargissez les restrictions](/fr/learn/matchmaking/matchmaker-in-depth.md#rule-expansion) pour garantir des matchs rapides :

* assouplir progressivement les restrictions de latence pour trouver plus de joueurs,
* réduire progressivement la taille minimale de l’équipe pour exiger moins de joueurs et lancer la partie plus tôt,
  * le serveur peut remplir les emplacements vides avec des joueurs IA,
  * ou [Analyse approfondie](/fr/learn/matchmaking/matchmaker-in-depth.md#backfill-match) pour ajouter des joueurs plus tard,
* définissez la taille minimale de l’équipe à 1 pour lancer la partie en solo après 150 s de temps d’attente.

[^1]: remplacez par le nom de votre propre application

[^2]: remplacez par la version de votre propre application

[^3]: différence maximale dépassée

[^4]: latence maximale dépassée

[^5]: Nom de domaine pleinement qualifié

[^6]: par exemple, pour 3 emplacements libres = \["3", "2", "1"]

[^7]: remplacez "2" par le nombre réel de membres du groupe
