リアルタイムサーバーの仕組み - Amazon GameLift

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

リアルタイムサーバーの仕組み

このトピックでは、マネージド Amazon GameLift とリアルタイムサーバーソリューションの概要について説明します。ここでは、Realtime Server がマルチプレイヤーゲームをサポートする方法について説明し、Realtime Server がどのようにマルチプレイヤーゲームをサポートしているかについて説明します。他の GameLift ソリューションの詳細については、「」を参照してください。Amazon GameLift とは

Realtime サーバーとは

Realtime サーバーは、マルチプレイヤーゲームで使用するために GameLift が提供する軽量ですぐに使用できるゲームサーバーです。多くのゲームは複雑な物理と計算を処理するためにカスタムゲームサーバーを必要としますが、ゲームによってはこれは過度な要件となることがよくあります。Realtime Serverを使用すると、カスタムゲームサーバーの開発、テスト、デプロイが不要になるため、このソリューションを選択すると、ゲームの完成までにかかる時間と労力を最小限に抑えることができます。

主な特徴は以下のとおりです。

  • ゲームクライアントとサーバーのやり取りへのフルネットワークスタックの使用。 Realtime サーバーは、メッセージングに TCP および UDP チャネルを使用します。また、GameLift による TLS 証明書の生成を有効にすることで、組み込みのサーバー認証とデータパケット暗号化の使用を選択することもできます。

  • ゲームサーバーの主な機能。 Realtime サーバーは、ゲームセッションを開始 (および停止) し、ゲームとマッチデータを管理し、クライアント接続を受け入れます。ゲームサーバーは、各クライアントからゲーム状態情報を受信し、それをゲームセッションの他のクライアントに中継することで、同期されたゲームセッション状態を維持します。

  • GameLift サービスとの統合。 リアルタイムサーバーは、GameLift サービスと通信するように設定されます。このサービスは、Realtime サーバーをトリガーしてゲームセッションを開始し、プレイヤーを接続時に検証し、ゲームサーバーからプレイヤーの接続状態とゲームのヘルス状態を収集します。対照的に、この機能はカスタムゲームサーバーに実装する必要があります。

  • カスタマイズ可能なサーバーロジック。 Realtime サーバーを設定し、ゲームに最適なサーバー側のゲームロジックでカスタマイズできます。または、最小限の設定によりシンプルな中継サーバーとして使用します。詳細情報 Realtime サーバーのカスタマイズ.

  • Realtime 設定およびサーバーロジックへのライブ更新。 Realtime サーバー構成はいつでも更新できます。GameLift は、更新された設定スクリプトを定期的にチェックするため、新しいバージョンをアップロードすると、すぐにフリートにデプロイされ、すべての新しいゲームセッションで使用されます。

  • FlexMatch マッチメーキングです。 Realtime Server を使用するゲームクライアントは、大規模なマッチを含むすべての FlexMatch マッチメーキング機能を利用できます。

  • ホスティングリソースの柔軟な制御。 Realtime Server を使用してデプロイされるゲームの場合、auto-scaling、マルチリージョンキュー、FleetiQ を使用したゲームセッションの配置、ゲームセッションのログ記録、メトリクスなど、のすべてのGameLift 管理機能を使用できます。ホスティングリソースの使用方法を決定します。

  • コンピューティングリソースオプションの範囲。 Realtime サーバーは Linux で実行されます。フリートのコンピューティングハードウェアのタイプを選択し、スポットインスタンスまたはオンデマンドインスタンスのどちらを使用するかも選択します。

  • AWS 信頼性. すべての GameLift と同様に、Realtime Server によるホスティングリソースは、Realtime Server によるホスティングリソースは、AWS。

ホスティングリソースのフリートを作成し、設定スクリプトを提供することで、Realtime サーバーを設定します。Realtime サーバーの作成とゲームクライアントの準備方法の詳細については、「」で説明しています。リアルタイムサーバーの使用を開始する

ゲームに合わせた Realtime サーバーの選択

カスタムゲームサーバーを構築する代わりに Realtime Server を選択するかどうかは主に、サーバーの複雑さに対するゲームのニーズによって決まります。ゲームに、複雑なサーバー側のゲームロジック、ゲームプレイの瞬時の物理演算など、カスタム機能が必要でない限り、がゲームに適したソリューションです。Realtime Server を使用するゲームには、より軽量のゲームやゲームクライアントでの計算処理のより大部分を管理するゲームが含まれます。例としては、メッセージングゲーム、ターンベースの戦略ゲーム、さまざまなモバイルゲームが挙げられます。Realtime Serverは、FleetIQ の使用と相まって、ほぼすべての種類のゲーム向けに効果的に、プレイヤーのレイテンシーを最短に抑えます。

主要コンポーネント

Realtime Server を使用するときは、以下のコンポーネントを使用します。これらのコンポーネントの詳細と、「Realtime Server を使用したゲームアーキテクチャ」でそれらがどのように連携するかについて確認してください。

  • ARealtime サーバーは、ゲームにクライアント/サーバーネットワーキングを提供します。また、GameLift サービスによってトリガーされたときにゲームセッションを開始し、接続時にプレイヤーの検証をリクエストして、プレイヤーの接続ステータスとゲームのヘルスステータスをレポートします。サーバーは、接続されているすべてのプレイヤー間でゲーム状態データを中継し、提供されていればカスタムゲームロジックを実行します。

  • ゲームクライアントは、プレイヤーのデバイスで実行されるゲームのソフトウェアです。ゲームクライアントは (クライアントサービスを介して) GameLift サービスに、参加するゲームセッションを見つけるか新しいセッションを開始するためのリクエストを行い、リアルタイムサーバーに接続してゲームに参加します。接続されると、ゲームクライアントは Realtime サーバーを介して、ゲーム内の他のプレイヤーとデータを送受信できます。

  • ARealtime スクリプトは、ゲームの設定とオプションのカスタムゲームロジックを提供します。スクリプトには、最小限の構成設定またはより複雑なゲームロジックが含まれる場合があります。Realtime スクリプトは、新しいホスティングリソースを起動するときに Realtime サーバーと共にデプロイされます。スクリプトは Node.js ベースの JavaScript で記述されます。

  • -GameLift サービスRealtime サーバーをホストするのに必要なコンピューティングリソースを管理し、プレイヤーがゲームに接続できるようにします。また、このサービスは、プレイヤーの需要に応じてリソースの数を調整します。アクティブなゲームセッションでプレイヤースロットを見つけて予約することで、プレイヤー参加リクエストを処理します。リアルタイムサーバーをトリガーしてゲームセッションを開始します。プレイヤーがゲームサーバーに接続するときにプレイヤーを検証します。このサービスは、Realtime サーバーのヘルスとプレイヤーの使用状況に関するメトリクスを収集します。

  • Aゲームセッションはゲームのインスタンスであり、Realtime サーバーで実行されます。プレイヤーは、ゲームセッションに接続して、ゲームのプレイや、他のプレイヤーとのやり取りを行います。

Realtime サーバーがゲームセッションを管理する方法

GameLift は、完全にカスタマイズされたゲームサーバーで処理するのと同じ方法で、Realtime Server とのゲームセッションを管理します。プレイヤーは、ゲームクライアントを使用して、新しいゲームセッションを作成したり、既存のゲームセッションを見つけて参加したりするリクエストを送信します。ゲームセッションの配置や FlexMatch のマッチメイキングなど、ゲームセッションを作成するほとんどの方法は、リアルタイムサーバーで使用できます (マッチバックフィルは現時点では使用できません)。

Realtime サーバーは、ホスティングインスタンスのフリートにデプロイされると、GameLift サービスとの通信を維持します。リアルタイムサーバーは、GameLift サービスからリクエストされるとゲームセッションを開始し、サービスからマッチメーキングデータなどの利用可能なゲームセッションデータとプレイヤーデータを受信します。ゲームがプレイヤースロットを使用して、ゲームスロットを予約するか、プレイヤー接続を認証する場合、Realtime サーバーは、プレイヤーの接続時に検証リクエストを GameLift サービスに送信できます。リアルタイムサーバーは、そのヘルスステータスを GameLift サービスにレポートし、プレイヤーが接続/切断したとき、およびゲームセッションが終了したときに、サービスに通知します。また、GameLift からのリクエストに応じてゲームセッションを強制終了します。この GameLift サービスとのやり取りは、すべての Realtime Server に完全に組み込まれています。

Realtime スクリプトに組み込んで、ゲームセッション管理用のカスタムロジックを追加するというオプションもあります。サーバー固有のオブジェクトへのアクセスや、コールバックを使用したイベント駆動型ロジックの追加、イベント以外のシナリオ (タイマーやステータスチェックなど) に基づくロジックの追加を行うコードを記述できます。たとえば、ゲームセッションオブジェクトにアクセスしたり、ゲームセッションの開始または終了時にアクションをトリガーしたりできます。

Realtime Client と Realtime Server のやり取り方法

ゲームセッション中、ゲーム内でのゲームクライアント間のやり取りは、メッセージングによって行われます。ゲームクライアントはメッセージを使用して、アクティビティ、ゲーム状態、関連するゲームデータを交換します。ゲームクライアントは Realtime サーバーへメッセージを送信し、そのサーバーはゲームクライアント間でメッセージを中継します。ゲームクライアントは Realtime Client SDK を使用してサーバーと通信します。この SDK はゲームクライアントに統合されている必要があります。Client SDK は、クライアントがゲームに接続し、メッセージを送受信し、ゲームから切断することを可能にする、一連の同期 API コールを定義しています。また、ゲームクライアントで特定のイベントに応答するために実装可能な、一連の非同期コールバックを定義しています。

さらに、Realtime スクリプトにゲームロジックを追加することで、クライアントとサーバーのやり取り方法をカスタマイズできます。カスタムゲームロジックにより、Realtime はイベント駆動型レスポンスをトリガーするコールバックを実装できます。たとえば、ゲームクライアントが特定のアチーブメントに到達したことをサーバーに通知すると、サーバーはメッセージを他のゲームクライアントに送信して、アナウンスを表示します。

通信プロトコル

Realtime サーバーと接続されたゲームクライアントとの通信では、2 つのチャネルとして、信頼性の高い配信のための TCP 接続と迅速な配信のための UDP チャネルが使用されます。メッセージを作成するときは、メッセージのタイプに応じて使用するプロトコルを選択します。メッセージ配信はデフォルトで UDP に設定されています。UDP チャンネルが設定されていないか使用できない場合は、すべてのメッセージがフォールバックとして TCP を使用して送信されます。

メッセージの内容

メッセージの内容は、必須のオペレーションコード (opCode) とオプションのペイロードの 2 つの要素で構成されています。必要に応じて、ペイロードがオペレーションコードに関連する追加のデータを提供している間、メッセージの opCode は特定のプレイヤーの活動やゲームイベントを識別します。これらの要素はいずれも開発者によって定義されます。つまり、どのアクションをどの opCode にマッピングするか、メッセージペイロードが必要かどうかを定義します。ゲームクライアントは、受信したメッセージ内の opCode に基づいてアクションを実行します。

プレイヤーグループ

Realtime Server は、プレイヤーのグループを管理する機能を提供します。デフォルトでは、ゲームに接続しているすべてのプレイヤーは「すべてのプレイヤー」グループに配置されます。さらに、開発者は自分のゲームに他のグループを設定でき、プレイヤーは同時に複数のグループのメンバーになることができます。グループメンバーは、グループ内のすべてのプレイヤーにメッセージを送信したり、グループとゲームデータを共有したりできます。グループの用途の 1 つは、プレイヤーチームを設定し、チームのコミュニケーションを管理することです。

TLS 証明書による Realtime サーバー

TLS 証明書の生成を有効にしたリアルタイムサーバーフリートを作成することもできます。GameLift はフリートの TLS 証明書を生成し、フリート内の各インスタンスの DNS エントリを作成します。ゲームでは、クライアント/サーバー接続を認証し、すべてのゲームクライアント/サーバー通信を暗号化できます。この機能により、セキュリティの強化と通信の暗号化を必要とするモバイルなどのさまざまなプラットフォームで、ゲームを公開できます。この機能は、サーバーのスプーフィング攻撃からゲームクライアント (およびプレイヤー) を保護し、悪意のあるアクターがデータ送信をハッキングまたはモニタリングすることを防ぎます。これらのサービスは、AWSCertificate Manager (ACM) であり、現在は追加コストなしで利用できます。

Realtime Server を使用すると、サーバー認証とデータパケット暗号化がすでにサービスに組み込まれており、TLS 証明書の生成をオンにすると有効になります。ゲームクライアントが Realtime サーバーに接続しようとすると、サーバーは TLS 証明書で自動的に応答します。この証明書はクライアントが検証します。暗号化は、TCP (Websocket) 通信の場合は TLS によって、UDP トラフィックの場合は DTLS によって処理されます。

Realtime サーバーのカスタマイズ

最も基本的な形式では、Realtime サーバーは、ステートレスな中継サーバーとして機能します。Realtime サーバーは、ゲームに接続されているゲームクライアント間でメッセージとゲームデータのパケットを中継しますが、メッセージの評価、データの処理、ゲームプレイロジックの実行は行いません。このように使用されると、各ゲームクライアントはゲーム状態の独自のビューを維持し、リレーサーバーを介して他のプレイヤーに更新情報を提供します。各ゲームクライアントは、これらの更新を組み込み、独自のゲーム状態を調整します。

また、Realtime スクリプト機能を構築することで、サーバーをカスタマイズすることもできます。Realtime Server の機能のシンプルさを活用しながら、実装することを選択できるサーバー側のプロセスは多数あります。たとえば、ゲームロジックでは、サーバー権限によるゲームの状態の表示により、ステートフルなゲームを構築することを選択できます。

サーバー側のコールバックのセットが Realtime スクリプトに対して定義されています。これらのコールバックを実装して、イベント駆動型の機能をサーバーに追加します。たとえば、以下のようになります。

  • ゲームクライアントがサーバーに接続を試みるときにプレイヤーを認証します。

  • リクエスト時にプレイヤーがグループに参加できるかどうかを確認します。

  • 特定のプレイヤーからのメッセージまたはターゲットプレイヤーへのメッセージの配信タイミングを評価するか、それに応じて追加の処理を実行します。

  • プレイヤーがグループを離れるか、サーバーから切断されたときに、すべてのプレイヤーに通知する、などのアクションを実行します。

  • ゲームセッションオブジェクトまたはメッセージオブジェクトの内容を評価してデータを使用します。

Realtime サーバーのデプロイと更新

Realtime サーバーは、GameLift の専用サーバーリソースを使用しています。提供される安定性とセキュリティに違いはありません。すべてのサーバーと同様に、GameLift のマッチメーキングおよびキューを Fleet IQ で使用して、プレイヤーのロケーションに基づいてゲームセッションの配置を最適化することで、レイテンシーを最小限に抑えることができます。

Realtime Server ゲームをGameLift でデプロイするときのプロセスは、従来のゲームサーバーをデプロイする場合とほとんど同じです。コンピューティングリソースのフリートを作成し、設定の詳細とオプションのカスタムロジックを含む Realtime スクリプトを使用してデプロイします。GameLift を使用すると、使用するフリートのタイプを選択し、フリート容量を管理します。また、フリートでゲームサーバープロセスを開始および実行する方法を制御します。「」でのゲームホスティングの詳細な説明GameLift の仕組みは、Realtime Server とカスタムゲームサーバーでのゲームホスティングを表しています。

Realtime Server の主な利点は、いつでもスクリプトを更新できることです。更新されたスクリプトをデプロイするために新しいフリートを作成する必要はありません。スクリプトを更新すると、新しいバージョンは数分以内にすべてのホスティングリソースに反映されます。新しいスクリプトがデプロイされると、それ以降に作成されたすべての新しいゲームセッションでは新しいスクリプトバージョンが使用されます (既存のゲームセッションでは引き続き元のバージョンが使用されます)。