次の方法で共有


コンテナー モードで LocalMultiplayerAgent を使用してゲーム サーバーを実行する方法

このチュートリアルでは、次の方法について説明します。

  • ラッパー サンプルを使用して [Linux/Windows] コンテナー ビルドを作成する
  • MultiplayerSettings.json を構成する
  • Docker のセットアップ
  • LocalMultiplayerAgent を実行する
  • ゲーム接続をテストする

[Linux/Windows] コンテナー ビルドを作成する

コンテナーに慣れていない場合は、「コンテナーと Docker の概要」を参照してください。

既存のサンプルを Windows または Linux コンテナーとしてパッケージ化する方法について説明します。 プラットフォーム (Windows/Linux ベースのコンテナー) ごとに異なる設定を構成する必要があります。 ここでは、Wrapper サンプルを使用して詳細を確認します。

Linux コンテナー ビルド

Linux コンテナーを使用して、Linux ビルドでラッパーと fakegame 実行可能ファイルを実行できます。 この場合は、Linux ビルドを作成する必要があります。 ラッパー Linux ビルドを作成する方法については、Linux コンテナー イメージを作成する方法を参照してください。

Windows コンテナー ビルド

LMA によって Windows コンテナー ビルドが作成されます。 設定を正しく構成するだけで作成されます (Windows コンテナーの設定を構成する方法については後で確認してください)

MultiplayerSettings.json を構成する

LMA ツールセットを抽出したフォルダーに移動し、MultiplayerSettings.json ファイルを開きます。 このファイルは、MPS 上のビルドをシミュレートするビルド構成モック ファイルです。

LMA MultiplayerSettings.json ジェネレーターを使用して json を設定することもできます。 ジェネレーターは、オプションに基づいて json を作成する単純な Web ページです。 ジェネレーターは LocalMultiplayerAgent/SettingsJsonGenerator にあります。

Wrapper サンプルを Linux Container として実行する MultiplayerSettings.Json の例を次に示します。

{
    "RunContainer": true, // Set RunContainer to true if you are running LMA in Container mode.
    "OutputFolder": "C:\\output\\LMAContainer", // Path where config files and logs will be generated from LMA at each run
    "NumHeartBeatsForActivateResponse": 10,
    "NumHeartBeatsForTerminateResponse": 60,
    "TitleId": "", // default value
    "BuildId": "00000000-0000-0000-0000-000000000000", // default value
    "Region": "59F84", // default value
    "AgentListeningPort": 56001, // default value
    "ContainerStartParameters": {
        /// replace ImageDetails fields to your own images saved on ACR.
        "ImageDetails": {
            "Registry": "mydockerregistry.io",
            "ImageName": "wrapper",
            "ImageTag": "0.1",
            "Username": "",
            "Password": ""
        }
    },
    "PortMappingsList": [
        [
            {
                "NodePort": 56100,
                "GamePort": {
                    "Name": "game_port", 
                    // The same value of GamePort Name should be also defined in the Wrapper so Wrapper can get a port information while it's running.
                    "Number": 80,
                    "Protocol": "TCP"
                }
            }
        ]
    ],
}

Windows Container の場合、コンテナーをビルドする必要はありません。 LMA は、ゲーム サーバーを Windows コンテナーとしてパッケージ化します。 ImageDetails フィールドに Windows コンテナのベース イメージを指定し、ワークステーション上のゲーム アセットが配置されている場所に LocalFilePath を設定するだけです。

"AssetDetails": [
    {
      "MountPath": "C:\\Assets",  
      // Mount Path should be "C:\\Assets" for Windows Container. 
      "LocalFilePath": "D:\\gameassets.zip" 
      // where your game server is located as an archive format.
    }
  ]

 "ContainerStartParameters": {
    "StartGameCommand": "C:\\Assets\\wrapper.exe -g C:\\Assets\\fakegame.exe arg1 arg2", 
    // Your game assets will be extracted under C:\\Assets (default mount path for Windows Container) and LMA will run your game server with StartGameCommand argument. 
     // Make sure the StartGameCommand provided above is an example of the Wrapper sample. 
    "ImageDetails": {
      "Registry": "mcr.microsoft.com",
      "ImageName": "playfab/multiplayer",
      "ImageTag": "wsc-10.0.17763.973.1",
      "Username": "", 
      "Password": ""
      // username and password are not required to use MCR image.
    }
    // LMA will package an existing game sample (path defined in LocalFilePath) as a Windows container.
 }

MultiplayerSettings.json で次のフィールドを正しく更新して、コンテナー モードで LMA を実行してください。

  • LocalFilePath - 前に作成したゲーム サーバー アセット zip ファイルへの (ワークステーション上の) 完全なローカル パス。たとえば、D:\gameassets.zip (JSON 形式ではバックスラッシュをエスケープする必要があります)。 このフィールドは、LMA がゲームアセットを見つけてコンテナーにパッケージ化する必要があるため、Windows コンテナーに必要です。

  • PortMappingsList - これらは、実行中にゲームで使用できるポートです。

    • NodePort はワークステーションで開かれたポートであり、GamePort にマップされます。
    • ワークステーションで開かれているポートで、GamePort.Number は、コンテナーで実行するときにゲームサーバーがバインドする必要のあるポートです。 たとえば、ここでは、fakegame.exe がリッスンするポート番号を 80 に設定します。
    • GamePort.Name をゲーム サーバーで定義されているのと同じ値に設定します。 キー GamePort.Name を使用して、実行時に値の GSDK 構成をチェックできます。
    • GamePort.Protocol - プロトコルの種類を指定する: TCP または UDP

    PortMappingsList: ゲーム サーバーがクライアントをリッスンしているプロトコルとポートに一致するように GamePort セクションを更新します。 複数のポートを追加できます。

  • ForcePullFromAcrOnLinuxContainersOnWindows - Linux コンテナ イメージを Docker レジストリからプルし、ローカル レジストリからのプルを回避する場合は true に設定します。 ほとんどの場合、この設定を false に設定します。

  • ContainerStartParameters.ImageDetails - ゲーム サーバー イメージは、コンテナー レジストリに公開することも、ローカルで構築することもできます。 Docker レジストリ (Azure Registry など) から Linux コンテナー イメージをプルする場合は、ユーザー名とパスワードの値を設定し、ForcePullFromAcrOnLinuxContainersOnWindows を true に設定する必要があります。 Windows コンテナーの場合、ユーザー名とパスワードは必要ありません。

  • OutputFolder - 出力ファイルと構成ファイルの生成先となるドライブまたはフォルダーのパス。 ゲームサーバーはこのパスの下に抽出されるため、利用可能な十分なスペースがあることを確認してください。 指定しない場合は、エージェント フォルダが使用されます。

  • AgentListeningPort - これは、LMA がゲーム サーバーと通信するためのポートです。 開いているポートであればどれでも機能します。デフォルト値は 56001 です。 56001 に別のプロセス バインドがある場合は、この値を変更するか、ポート 56001 でもう一方のプロセスを強制終了する必要があります。

  • ResourceLimits (オプション) - 指定されている場合、docker は CPU 使用量またはメモリ使用量を制限します。 警告: サーバーが許可されたメモリを超えると、サーバーは強制終了されます。 ResourceLimits は、コンテナー モードでのみ指定できます。

  • SessionCookie (オプション) - RequestMultiplayerServer API 呼び出しの一部としてゲーム サーバーに渡されるセッション Cookie。 MPS の実際のシナリオでは、接続が確立された後、サーバーは、SessionCookie から対応するリソースを読み込むようクライアントに通知します。

Docker のセットアップ

PowerShell スクリプトを実行して"PlayFab" という名前の Docker ネットワークを設定し、LocalMultiplayerAgent と通信するためのファイアウォール規則を追加します。

  • Linux コンテナーの場合は、SetupLinuxContainersOnWindows.ps1 を実行します。
    Windows コンテナーの場合は、Setup.ps1 を実行します。 Microsoft/PlayFab-Multiplayer から PlayFab Docker イメージをプルダウンします。
    スクリプトを初めて実行するときは、コンテナー イメージのダウンロードに数分かかる場合があります。

    このセットアップを正常に実行するには、インストールしたサードパーティのウイルス対策プログラムのファイアウォールを構成する必要がある場合があります。

Windows コンテナーと Linux コンテナー間で適切な Docker デーモンをターゲットにする方法については、「Windows/Linux コンテナーを使用するように Docker を切り替える方法」を参照してください。

LocalMultiplayerAgent を実行する

  • PowerShell ウィンドウの場合:
    LocalMultiplayerAgent.exe を含む LMA の下のディレクトリに移動します。

  • Windows コンテナーに対して LocalMultiplayerAgent.exe を実行します。
    Linux コンテナーに対して LocalMultiplayerAgent.exe -lcow を実行します。
    (lcow は Windows 上の Linux コンテナーを表します)

    この時点で、LMA は http リスナーを設定し、コンテナーを実行します。 docker ps コマンドを実行して、マシンで実行中のコンテナーを確認できます。

LMA は、ゲーム サーバーに統合されている GSDK からのハートビートを待ちます。 GSDK が正しく統合されている場合、LMA は次の順序で出力を出力します。

  1. CurrentGameState - Initializing
    (ゲーム サーバーが GSDK::ReadyForPlayers を直接呼び出し、GSDK::Start を呼び出していない場合、これは表示されない可能性があります)
  2. CurrentGameState - StandingBy
  3. CurrentGameState - Active
  4. CurrentGameState - Terminating

ゲーム サーバーの状態の詳細については、PlayFab マルチプレイヤー サーバーのゲーム サーバー ライフサイクルとはを参照してください。

シャットダウン コールバックが正しく設定されている場合、状態が終了に設定された直後にゲーム サーバーが終了します。 PlayFab プラットフォームで不正なシャットダウンを避けるために、ゲーム サーバーが終了していることを確認することが重要です。

LMA もゲームと同時に終了する必要があります。

ゲームへの接続をテストする

LMA が CurrentGameState - Active を出力すると、ゲーム サーバーがリッスンしている IP アドレス 127.0.0.1 とポート NodePort を使用してゲーム サーバーに接続できます。

Wrapper サンプルを使用している場合は、ブラウザにアドレス http://127.0.0.1:56100/Hello を入力して GET リクエストをテストできます。 詳細については、Wrapper サンプルをチェックしてください。

MultiplayerSettings.json の NumHeartBeatsForActivateResponseNumHeartBeatsForTerminateResponse の値を更新して、スタンバイ/アクティブ状態の期間を調整することもできます。

トラブルシューティング

  • コンテナー モードで、ゲーム サーバーが "コンテナー...終了コード 1 で終了しました" のようなエラーですぐに終了するが、プロセス モードでは正常に機能する場合は、必要なすべてのシステム DLL がアセット パッケージに含まれていることを確認してください。
  • すべてのログは、MultiplayerSettings.json ファイルで指定されているOutputFolderの下にあります。 LocalMultiplayerAgent は、起動されるたびに、タイムスタンプをフォルダー名として新しいフォルダーを作成します。 ゲーム サーバーのすべてのログは GSDK 経由で出力され、GameLogs フォルダー内にあります。
    ゲーム サーバーがコンテナーで実行されている場合、ディレクトリ階層のレベルが追加されてログ ファイルが振り分けられていることがあります。
  • GSDK は、OutputFolder の下の GameLogs フォルダーにデバッグ ログを書き込みます。 これらのログは、ゲーム サーバーによって出力されたログとともに GameLogs フォルダー内にあります。
  • 使用しているポートでのトラフィックを許可するようにファイアウォール (Windows や他のウイルス対策プログラム) を構成しておきます。
  • 次のようなエラーが発生した場合: 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. これは、LocalMultiplayerAgent が途中で終了した場合に発生する可能性があります。 コマンド docker ps を使用して実行中のコンテナーを見つけ、docker kill <container_name> を使用してコンテナーを削除します。
  • Failed to find network 'playfab' を含むエラーが発生した場合。 Setup.ps1 を再実行してみてください

既知の制限事項

  1. コンテナーは、デバッグの終了時に終了しない場合があります。 これが発生した場合は、管理者として次の PowerShell コマンドを実行してください。 これらのコマンドは、LocalMultiplayerAgent によって開始されなかったものを含め、すべてのコンテナーを停止して削除します。
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)