Amazon GameLift
開発者ガイド (Version )

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

このトピックでは、Amazon GameLift リアルタイムサーバー の機能の概要を示し、リアルタイムサーバー がどのような場合にゲームに適しているか、どのようにマルチプレイヤーゲームをサポートしているかについて説明します。

Realtime サーバーとは

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

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

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

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

  • GameLift サービスとの統合。 GameLift サービスは、RealTime サーバーをトリガーしてゲームセッションを開始し、接続時にプレイヤーを検証して、プレイヤーの接続ステータスとゲームのヘルスステータスをゲームサーバーから収集します。この機能は、カスタムゲームサーバーに統合する必要があり、リアルタイムサーバー で完全に実装されています。

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

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

  • FlexMatch マッチメーキング。 リアルタイムサーバー を使用するゲームクライアントは、大規模なマッチを含む、FlexMatch のすべてのマッチメーキング機能を利用できます (バックフィルはまだ利用できません)。

  • ホスティングリソースの柔軟な制御。 リアルタイムサーバー を使用してデプロイされるゲームの場合、Auto Scaling、マルチリージョンキュー、FleetIQ を使用したゲームセッションの配置、ゲームセッションのログ記録、メトリクスなど、GameLift のすべてのホスティング機能を使用できます。ランタイム設定およびその他の制御機能によりホスティングリソースの使用方法を決定します。

  • コンピューティングリソースのさまざまなオプション。RealTime サーバーは Linux で実行されます。フリートのコンピューティングリソースのタイプ (インスタンスタイプ) と、スポットインスタンスまたはオンデマンドインスタンスのどちらを使用するかを選択します。

  • AWS の信頼性。 すべての GameLift と同様、リアルタイムサーバー でのホスティングリソースは、AWS の高レベルの品質、セキュリティ、信頼性をもたらします。

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

ゲームに合わせた リアルタイムサーバー の選択

カスタムゲームサーバーを構築する代わりに リアルタイムサーバー を選択するかどうかは主に、サーバーの複雑さに対するゲームのニーズによって決まります。ゲームに複雑なゲームロジックと瞬時の計算が必要かどうかを検討します。 必要でない場合は、リアルタイムサーバー がゲームに適したソリューションであると考えられます。最も効果的に リアルタイムサーバー を使用するゲームには、軽量のゲームやゲームクライアントでの計算処理のより大部分を管理するゲームが含まれます。例としては、メッセージングゲーム、ターン制の戦略ゲームなど、さまざまなモバイルゲームがあります。リアルタイムサーバー は、FleetIQ の使用と相まって、プレイヤーのレイテンシーを最小限に抑えるための優れたツールを提供しますが、一人称視点シューティングゲームやその他の高速アクションゲームなど、プレイヤーのレイテンシーに対する許容度が非常に低いゲームは、堅牢なカスタムゲームサーバーによって処理される方が適している場合があります。

主要コンポーネント

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

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

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

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

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

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

リアルタイムサーバー でゲームセッションを管理する方法

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

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

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

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

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

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

通信プロトコル

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

メッセージの内容

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

プレイヤーグループ

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

リアルタイムサーバー での TLS 証明書の使用

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

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

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

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

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

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

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

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

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

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

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

リアルタイムサーバー のデプロイと更新

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

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

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