Passer au contenu principal

Exécuter un serveur de jeu à l’aide de LocalMultiplayerAgent en mode conteneur

Ce tutoriel explique comment :
  • Créer une build de conteneur [Linux/Windows] à l’aide de l’exemple Wrapper
  • Configurer MultiplayerSettings.json
  • Configurer Docker
  • Exécuter LocalMultiplayerAgent
  • Tester la connexion à votre jeu

Créer une build de conteneur [Linux/Windows]

Si vous ne connaissez pas bien les conteneurs, consultez Introduction aux conteneurs et à Docker. Nous allons voir comment empaqueter un exemple existant sous forme de conteneur Windows ou Linux. Vous devrez configurer des paramètres différents selon la plateforme (conteneur Windows ou Linux). Nous utiliserons ici l’exemple Wrapper et en détaillerons les spécificités.

Build de conteneur Linux

Vous pouvez exécuter les exécutables wrapper et fakegame sur une build Linux, à l’aide de conteneurs Linux. Dans ce cas, vous devez créer une build Linux. Pour savoir comment créer une build Linux de Wrapper, consultez comment créer une image de conteneur Linux

Build de conteneur Windows

LMA crée une build de conteneur Windows pour vous. Il vous suffit de configurer correctement les paramètres (voir plus loin comment configurer les paramètres d’un conteneur Windows)

Configurer MultiplayerSettings.json

Accédez au dossier dans lequel vous avez extrait l’ensemble d’outils LMA et ouvrez le fichier MultiplayerSettings.json. Ce fichier est un fichier de configuration de build simulé qui reproduit la build sur MPS. Vous pouvez également générer un json à l’aide du générateur LMA MultiplayerSettings.json. Le générateur est une page web simple qui crée un json en fonction de vos options. Vous le trouverez sous LocalMultiplayerAgent/SettingsJsonGenerator. Voici un exemple de MultiplayerSettings.Json permettant d’exécuter l’exemple Wrapper en tant que Linux Container.
Pour un Windows Container, vous n’avez pas besoin de créer votre conteneur. LMA empaquette votre serveur de jeu en tant que conteneur Windows. Il vous suffit de spécifier l’image de base du conteneur Windows dans le champ ImageDetails et de définir LocalFilePath sur l’emplacement de vos ressources de jeu sur votre station de travail.
Veillez à mettre à jour correctement les champs suivants dans MultiplayerSettings.json pour exécuter LMA en mode conteneur.
  • LocalFilePath : chemin local complet (sur votre station de travail) du fichier zip des ressources du serveur de jeu créé précédemment, par exemple : D:\gameassets.zip (notez que les barres obliques inverses doivent être échappées pour le format JSON). Ce champ est obligatoire pour un conteneur Windows, car LMA doit localiser vos ressources de jeu, puis les empaqueter dans un conteneur.
  • PortMappingsList : il s’agit des ports disponibles pour votre jeu pendant son exécution.
    • NodePort est le port ouvert sur votre station de travail, qui sera mappé au GamePort.
    • GamePort.Number est le port auquel votre serveur de jeu doit se lier lorsqu’il s’exécute dans un conteneur. Par exemple, nous définissons ici le numéro de port 80, sur lequel fakegame.exe écoutera.
    • Définissez GamePort.Name sur la même valeur que celle définie dans votre serveur de jeu. Vous pouvez vérifier cette valeur dans la configuration du GSDK au moment de l’exécution, avec la clé GamePort.Name.
    • GamePort.Protocol : spécifiez le type de protocole : TCP ou UDP
    Mettez à jour la section GamePort pour qu’elle corresponde au protocole et au port sur lesquels votre serveur de jeu écoute les clients. Vous pouvez ajouter plusieurs ports.
  • ForcePullFromAcrOnLinuxContainersOnWindows : définissez cette valeur sur true si vous souhaitez extraire l’image de conteneur Linux depuis le registre Docker plutôt que depuis le registre local. Dans la plupart des cas, cette valeur doit être définie sur false.
  • ContainerStartParameters.ImageDetails : votre image de serveur de jeu peut être publiée dans un registre de conteneurs ou générée localement. Si vous souhaitez extraire l’image de conteneur Linux depuis un registre Docker (par exemple, Azure Registry), vous devez définir le nom d’utilisateur et le mot de passe, et définir ForcePullFromAcrOnLinuxContainersOnWindows sur true. Pour un conteneur Windows, le nom d’utilisateur et le mot de passe ne sont pas requis.
  • OutputFolder : chemin d’un lecteur ou d’un dossier dans lequel les sorties et les fichiers de configuration sont générés. Assurez-vous de disposer de suffisamment d’espace, car le serveur de jeu sera extrait sous ce chemin. Si ce champ n’est pas spécifié, le dossier de l’agent est utilisé.
  • AgentListeningPort : il s’agit du port utilisé par LMA pour communiquer avec le serveur de jeu. N’importe quel port ouvert convient ; 56001 est la valeur par défaut. Si un autre processus est lié au port 56001, vous devez modifier cette valeur ou arrêter l’autre processus sur le port 56001.
  • ResourceLimits (facultatif) : s’il est spécifié, Docker limite l’utilisation du processeur et de la mémoire. Avertissement : si votre serveur dépasse la mémoire autorisée, il est arrêté. ResourceLimits ne peut être spécifié qu’en mode conteneur.
  • SessionCookie (facultatif) : tout cookie de session transmis à votre serveur de jeu dans le cadre de l’appel d’API RequestMultiplayerServer. Dans un scénario réel sur MPS, une fois la connexion établie, le serveur demande au client de charger les ressources correspondantes à partir de SessionCookie.

Configuration de Docker

Exécutez des scripts PowerShell pour configurer les réseaux Docker appelés “PlayFab” et ajouter des règles de pare-feu permettant de communiquer avec LocalMultiplayerAgent.
  • Pour un conteneur Linux, exécutez SetupLinuxContainersOnWindows.ps1.
    Pour un conteneur Windows, exécutez Setup.ps1. Ce script télécharge l’image Docker PlayFab depuis Microsoft/PlayFab-Multiplayer.
    Notez que lors de la première exécution du script, le téléchargement de l’image de conteneur peut prendre quelques minutes.
    Pour que cette configuration réussisse, vous devrez peut-être configurer le pare-feu de tout programme antivirus tiers que vous avez installé.
Pour savoir comment cibler le bon démon Docker entre conteneurs Windows et Linux, consultez Basculer Docker entre les conteneurs Windows et Linux

Exécuter LocalMultiplayerAgent

  • Dans une fenêtre PowerShell :
    Accédez au répertoire de LMA qui contient LocalMultiplayerAgent.exe.
  • Exécutez LocalMultiplayerAgent.exe pour un conteneur Windows.
    Exécutez LocalMultiplayerAgent.exe -lcow pour un conteneur Linux.
    (lcow signifie Linux Containers On Windows)
    À ce stade, LMA configure l’écouteur http et exécute un conteneur. Vous pouvez exécuter la commande docker ps pour afficher les conteneurs en cours d’exécution sur votre machine.
LMA attend les pulsations du GSDK intégré à votre serveur de jeu. Si le GSDK est correctement intégré, LMA affiche les sorties dans l’ordre suivant :
  1. CurrentGameState - Initializing
    (Cette ligne peut ne pas s’afficher si votre serveur de jeu appelle directement GSDK::ReadyForPlayers sans appeler GSDK::Start)
  2. CurrentGameState - StandingBy
  3. CurrentGameState - Active
  4. CurrentGameState - Terminating
Pour en savoir plus sur les états d’un serveur de jeu, consultez Cycle de vie des serveurs de jeu de PlayFab Multiplayer Server. Si les rappels d’arrêt sont correctement configurés, votre serveur de jeu se ferme peu après le passage à l’état Terminating. Il est important de vérifier que le serveur de jeu se ferme afin d’éviter des arrêts non contrôlés sur la plateforme PlayFab. LMA doit également se terminer en même temps que le jeu.

Tester la connexion à votre jeu

Une fois que LMA affiche CurrentGameState - Active, vous pouvez vous connecter à votre serveur de jeu à l’aide de l’adresse IP 127.0.0.1 et du port NodePort sur lequel votre serveur de jeu écoute. Si vous utilisez l’exemple Wrapper, vous pouvez tester une requête GET en saisissant l’adresse http://127.0.0.1:56100/Hello dans votre navigateur. Pour plus de détails, consultez l’exemple Wrapper. Vous pouvez également mettre à jour les valeurs de NumHeartBeatsForActivateResponse et de NumHeartBeatsForTerminateResponse dans MultiplayerSettings.json pour ajuster la durée des états StandingBy/Active.

Résolution des problèmes

  • En mode conteneur, si votre serveur de jeu se ferme immédiatement avec une erreur semblable à “Container … exited with exit code 1”, mais fonctionne correctement en mode processus, assurez-vous d’avoir inclus toutes les DLL système requises dans votre package de ressources.
  • Tous les journaux se trouvent sous le OutputFolder spécifié dans le fichier MultiplayerSettings.json. LocalMultiplayerAgent crée un nouveau dossier à chaque démarrage, avec l’horodatage comme nom de dossier. Tous les journaux du serveur de jeu émis via le GSDK se trouvent dans le dossier GameLogs.
    Si le serveur de jeu s’exécute dans un conteneur, il peut y avoir un niveau supplémentaire dans la hiérarchie des répertoires à parcourir.
  • Le GSDK écrit des journaux de débogage dans le dossier GameLogs sous le OutputFolder. Ces journaux se trouvent dans le dossier GameLogs, avec les journaux générés par le serveur de jeu.
  • Assurez-vous que les pare-feu (Windows et autres antivirus) sont configurés pour autoriser le trafic sur les ports.
  • Si vous obtenez une erreur semblable à : Docker API responded with status code=InternalServerError, response={"message":"failed to create endpoint <container_name> on network playfab: hnsCall failed in Win32: The specified port already exists". It is likely there is already a container running on the specified port. Cela peut se produire si LocalMultiplayerAgent se ferme prématurément. Utilisez la commande docker ps pour trouver le conteneur en cours d’exécution, puis supprimez-le à l’aide de docker kill <container_name>.
  • Si vous obtenez une erreur contenant Failed to find network 'playfab', essayez de réexécuter Setup.ps1

Limitations connues

  1. Il est possible que les conteneurs ne s’arrêtent pas à la fin du débogage. Dans ce cas, exécutez les commandes PowerShell suivantes en tant qu’administrateur. Ces commandes arrêtent et suppriment tous les conteneurs, y compris ceux qui n’ont pas été démarrés par LocalMultiplayerAgent.
Dernière modification le 8 octobre 2026