Cómo ejecutar un servidor de juegos con LocalMultiplayerAgent en modo de contenedor
Este tutorial describe cómo:- Crear una compilación de contenedor [Linux/Windows] con el ejemplo Wrapper
- Configurar MultiplayerSettings.json
- Configurar Docker
- Ejecutar LocalMultiplayerAgent
- Probar la conexión con su juego
Crear una compilación de contenedor [Linux/Windows]
Si no está familiarizado con los contenedores, consulte Introducción a los contenedores y Docker. Aprenderemos a empaquetar un ejemplo existente como contenedor de Windows o Linux. Deberá configurar opciones diferentes según la plataforma (contenedor basado en Windows/Linux). Aquí usaremos el ejemplo Wrapper y repasaremos los detalles.Compilación de contenedor de Linux
Puede ejecutar los ejecutables wrapper y fakegame en una compilación de Linux, mediante contenedores de Linux. En este caso, debe crear una compilación de Linux. Para obtener información sobre cómo crear una compilación de Linux de Wrapper, consulte cómo crear una imagen de contenedor de LinuxCompilación de contenedor de Windows
LMA creará una compilación de contenedor de Windows por usted. Solo necesita configurar las opciones correctamente (consulte más adelante cómo configurar las opciones para el contenedor de Windows)Configurar MultiplayerSettings.json
Vaya a la carpeta donde extrajo el conjunto de herramientas de LMA y abra el archivo MultiplayerSettings.json. Este archivo es un archivo ficticio de configuración de compilación que simula la compilación en MPS. También puede rellenar un json con el Generador de MultiplayerSettings.json de LMA. El Generador es una página web sencilla que crea un json basado en sus opciones. Puede encontrar el Generador en LocalMultiplayerAgent/SettingsJsonGenerator. Este es el ejemplo de MultiplayerSettings.Json para ejecutar el ejemplo Wrapper comoLinux Container.
Windows Container, no es necesario compilar el contenedor. LMA empaquetará su servidor de juegos como contenedor de Windows. Solo necesita especificar la imagen base del contenedor de Windows en el campo ImageDetails y establecer LocalFilePath en la ubicación donde se encuentra su recurso de juego en su estación de trabajo.
-
LocalFilePath: ruta local completa (en su estación de trabajo) al archivo zip del recurso del servidor de juegos creado anteriormente, por ejemplo: D:\gameassets.zip (tenga en cuenta que las barras diagonales inversas deben escaparse para el formato JSON). Este campo es obligatorio para el contenedor de Windows, ya que LMA necesita localizar su recurso de juego y luego empaquetarlo en un contenedor. -
PortMappingsList: estos son los puertos que están disponibles para su juego mientras se ejecuta.NodePortes el puerto que se abre en su estación de trabajo y se asignará al GamePort.GamePort.Numberes el puerto al que su servidor de juegos debe enlazarse cuando se ejecuta en un contenedor. Por ejemplo, aquí establecemos el número de puerto en 80, que es el que escuchará fakegame.exe.- Establezca
GamePort.Nameen el mismo valor definido en su servidor de juegos. Puede comprobar la configuración del GSDK en tiempo de ejecución para obtener el valor con la clave GamePort.Name. GamePort.Protocol: especifique el tipo de protocolo: TCP o UDP
-
ForcePullFromAcrOnLinuxContainersOnWindows: establézcalo en true cuando quiera extraer la imagen de contenedor de Linux desde el registro de Docker y evitar la extracción desde el registro local. En la mayoría de los casos, querrá establecerlo en false. -
ContainerStartParameters.ImageDetails: la imagen de su servidor de juegos puede publicarse en un registro de contenedores o compilarse localmente. Si desea extraer la imagen de contenedor de Linux desde el registro de Docker (por ejemplo, Azure Registry), debe establecer el valor de nombre de usuario y contraseña, y establecerForcePullFromAcrOnLinuxContainersOnWindowsen true. Para el contenedor de Windows, el nombre de usuario y la contraseña no son necesarios. -
OutputFolder: ruta a una unidad o carpeta donde se generan las salidas y los archivos de configuración. Asegúrese de que haya suficiente espacio disponible, ya que el servidor de juegos se extraerá en esta ruta. Si no se especifica, se usa la carpeta del agente. -
AgentListeningPort: este es el puerto que usa LMA para comunicarse con el servidor de juegos. Cualquier puerto abierto funcionará; 56001 es el valor predeterminado. Si tiene otro proceso enlazado al puerto 56001, debe cambiar este valor o finalizar el otro proceso en el puerto 56001. -
ResourceLimits(opcional): si se especifica, Docker limita el uso de CPU/memoria. Advertencia: si su servidor supera la memoria permitida, se finaliza. ResourceLimits solo puede especificarse en modo de contenedor. -
SessionCookie(opcional): cualquier cookie de sesión que se pasa a su servidor de juegos como parte de la llamada a la API RequestMultiplayerServer. En el escenario real en MPS, después de establecer la conexión, el servidor notificará al cliente que cargue los recursos correspondientes desde SessionCookie.
Configuración de Docker
Ejecute los scripts de PowerShell para configurar las redes de Docker denominadas “PlayFab” y agregar reglas de firewall para comunicarse con LocalMultiplayerAgent.- Para el contenedor de Linux, ejecute
SetupLinuxContainersOnWindows.ps1.
Para el contenedor de Windows, ejecuteSetup.ps1. Descargará la imagen de Docker de PlayFab desde Microsoft/PlayFab-Multiplayer.
Tenga en cuenta que la primera vez que se ejecuta el script, la descarga de la imagen de contenedor puede tardar unos minutos.Para ejecutar esta configuración correctamente, es posible que tenga que configurar el firewall de cualquier programa antivirus de terceros que tenga instalado.
Ejecutar LocalMultiplayerAgent
-
En una ventana de PowerShell:
Vaya al directorio de LMA que contiene LocalMultiplayerAgent.exe. -
Ejecute
LocalMultiplayerAgent.exepara el contenedor de Windows.
EjecuteLocalMultiplayerAgent.exe -lcowpara el contenedor de Linux.
(lcow significa Linux Containers On Windows) En este punto, LMA configura el agente de escucha http y ejecuta un contenedor. Puede ejecutar el comandodocker pspara ver los contenedores en ejecución en su máquina.
CurrentGameState - Initializing
(Es posible que esto no aparezca si su servidor de juegos llama directamente a GSDK::ReadyForPlayers y no llama a GSDK::Start)CurrentGameState - StandingByCurrentGameState - ActiveCurrentGameState - Terminating
Probar la conexión con su juego
Una vez que LMA imprime CurrentGameState - Active, puede conectarse a su servidor de juegos mediante la dirección IP 127.0.0.1 y el puerto NodePort en el que su servidor de juegos está escuchando. Si usa el ejemplo Wrapper, puede probar una solicitud GET introduciendo la dirección http://127.0.0.1:56100/Hello en su explorador. Para obtener más detalles, consulte el ejemplo Wrapper. También puede actualizar los valores de NumHeartBeatsForActivateResponse y NumHeartBeatsForTerminateResponse en MultiplayerSettings.json para ajustar la duración del estado standing-by/active.Solución de problemas
- En modo de contenedor, si su servidor de juegos se cierra inmediatamente con un error similar a “Container … exited with exit code 1”, pero funciona bien en modo de proceso, asegúrese de que ha incluido todas las DLL del sistema necesarias en su paquete de recursos.
- Todos los registros se encuentran en la carpeta
OutputFolderespecificada en el archivo MultiplayerSettings.json. LocalMultiplayerAgent crea una carpeta nueva cada vez que se inicia, con la marca de tiempo como nombre de carpeta. Todos los registros del servidor de juegos emitidos mediante el GSDK se encuentran dentro de la carpeta GameLogs.
Si el servidor de juegos se ejecuta en un contenedor, es posible que haya un nivel adicional de jerarquía de directorios por recorrer. - El GSDK escribe registros de depuración en la carpeta GameLogs dentro de
OutputFolder. Estos registros se encuentran dentro de la carpeta GameLogs junto con los registros generados por el servidor de juegos. - Asegúrese de que los firewalls (de Windows y otros antivirus) estén configurados para permitir el tráfico a través de los puertos.
- Si recibe un error similar a:
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.Esto puede ocurrir si LocalMultiplayerAgent se cierra prematuramente. Use el comandodocker pspara encontrar el contenedor que se está ejecutando y luego elimínelo mediantedocker kill <container_name>. - Si recibe un error que contiene
Failed to find network 'playfab', intente volver a ejecutar Setup.ps1
Limitaciones conocidas
- Es posible que los contenedores no terminen al final de la depuración. Si esto ocurre, ejecute los siguientes comandos de PowerShell como administrador. Estos comandos detienen y quitan todos los contenedores, incluidos los que no fueron iniciados por LocalMultiplayerAgent.
