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 LinuxBuild 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 queLinux Container.
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.
-
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.NodePortest le port ouvert sur votre station de travail, qui sera mappé au GamePort.GamePort.Numberest 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.Namesur 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
-
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éfinirForcePullFromAcrOnLinuxContainersOnWindowssur 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écutezSetup.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é.
Exécuter LocalMultiplayerAgent
-
Dans une fenêtre PowerShell :
Accédez au répertoire de LMA qui contient LocalMultiplayerAgent.exe. -
Exécutez
LocalMultiplayerAgent.exepour un conteneur Windows.
ExécutezLocalMultiplayerAgent.exe -lcowpour 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 commandedocker pspour afficher les conteneurs en cours d’exécution sur votre machine.
CurrentGameState - Initializing
(Cette ligne peut ne pas s’afficher si votre serveur de jeu appelle directement GSDK::ReadyForPlayers sans appeler GSDK::Start)CurrentGameState - StandingByCurrentGameState - ActiveCurrentGameState - Terminating
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
OutputFolderspé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 commandedocker pspour trouver le conteneur en cours d’exécution, puis supprimez-le à l’aide dedocker kill <container_name>. - Si vous obtenez une erreur contenant
Failed to find network 'playfab', essayez de réexécuter Setup.ps1
Limitations connues
- 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.
