# Dedicated Game Server (専用ゲームサーバー) とは？

Dedicated Game Server  (専用ゲームサーバー、以降DGS) とは、実際のゲームループをサーバー上で実行し、そのゲームセッションにおける最終的な権威となるサーバーのことです。接続されたプレイヤーデバイスは入力付きの再生デバイスとなります。この構成により、全てのゲームロジックや物理計算がサーバー上で処理・実行され、クライアントデバイスではなくサーバーから各プレイヤーへ結果が送信されるため、不正行為（チート）を防止できます。\
Diarkis CSAR を利用することで、DGS を Diarkis サーバークラスターの一部として動作させることができます。これにより、クラスター内の他の Diarkis サーバーと直接通信し、データを共有することが可能になります。Diarkis CSAR SDK はC++ と C# をサポートしており、Unreal Engine や Unity などの一般的なゲームエンジンや独自のゲームエンジンでも利用できます。<br>

Diarkis サーバークラスターはメッシュベースの機能だけでなく、Dedicated Game Server のオーケストレーションも担当します。また、Diarkis CSAR は Kubernetes 上で Agones のように ホスティングとスケーリングを管理することもできます。

Diarkis CSAR が他の類似機能を提供するソリューションと異なる点は、Diarkis のクラスターアーキテクチャを活かし、ゲーム状態やプレイヤー状態を維持したまま、プレイヤーデバイスがサーバー間を移動できることです。これはサーバーがクラッシュした場合でも機能します。エンドユーザー（プレイヤー）は中断した場所からプレイを再開できます。Diarkis CSAR を専用ゲームサーバーに組み込むのは非常に簡単です。CSAR のライブラリとヘッダファイルをプロジェクトに含めてビルドするだけです。

## CSAR DGS のローカル開発

Diarkis サーバークラスターは、Windows や Mac OS などのローカルマシン上でも動作させることができます。ローカルマシン上でゲームサーバーを実行するために必要なのは Diarkis だけで、他のツールは不要です。そのためセットアップも非常にシンプルです。

ゲーム開発中に専用ゲームサーバーを動かすためだけにクラウドプロジェクトを設定する必要はありません。これにより、開発者はゲームをビルドしながら簡単かつ迅速にイテレーションを回すことができます。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2FGoNDr9N0wM2HPuFplXEV%2Fcsar-local.png?alt=media&#x26;token=989edfed-a80b-49d8-85d8-8abfcbcc8715" alt=""><figcaption></figcaption></figure>

Kubernetes 環境がなくても各プロセスを起動することで、Diarkis クラスターとして、各種プロセスが管理されます。DGS プロセスを開始、終了するだけで増減が可能です。それにより、開発者が任意のタイミングで DGS をビルドして動作確認することができます。

{% @mermaid/diagram content="graph LR
startServerProcesses\["mars,HTTP,UDP<br>サーバープロセスを起動"]
implement\["クライアント、<br>DGS の実装"]
DGSBuild\["DGS ビルド"]
startDGSProcess\["DGS プロセスの起動<br>（再起動）"]
check\["動作確認"]
startServerProcesses --> startDGSProcess
implement --> DGSBuild
DGSBuild --> startDGSProcess
startDGSProcess --> check
check --> implement" %}

## CSAR DGS のインフラ構成

Diarkis CSAR を使うと、Diarkis クラスター内で容易に DGS を管理することが可能です。Diarkis クラスターの耐障害性は CSAR においても有効で、DGS のホスティングとスケーリングを管理でき、必要に応じて柔軟にスケールすることが可能です。更に、MatchMaker や Room モジュールと連携することで、Diarkis クラスター内だけでマッチングから DGS 上でのゲームセッション開始までシームレスに行うことが可能です。

以下は Diarkis CSAR を使ったゲームプレイ開始から終了までのフローの一例です。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fx5eWdzMdsFnNEtodgoZJ%2Fcsar-infrastructure.png?alt=media&#x26;token=87f0f78e-1603-40c7-b965-e9cf1c6a5278" alt=""><figcaption></figcaption></figure>

1. クライアントはゲームの API サーバーを通じて、Diarkis への認証処理を行います。
2. Diarkis UDP サーバーに接続します。
3. Room を作成および参加します。
4. UDP サーバーにコマンドを発行して、DGS を allocate します。
   1. UDP サーバーから DGS を確保します。
   2. 必要に応じて Autoscaler によって DGS のスケーリングを行います。
   3. UDP サーバーはクライアントに対して、エンドポイントと credential 情報を返します。
5. allocate した DGS に接続します。
6. ゲームセッションを行います。この間の通信方法などのロジック処理は DGS の実装に依存します。
7. ゲームセッションを終了する際は、終了処理を呼び出して、DGS をシャットダウンします。

## ホストマイグレーション

Diarkis CSAR は、ゲームセッションをサーバー間で自在に移行させつつ、ゲーム状態やプレイヤー状態を維持することができます。これにより、Google の Preemptible VM や AWS の Spot Instance などの一時的なサーバーリソースを利用してコストを削減することが可能です。Diarkis CSAR のホストマイグレーションはコスト削減だけでなく、全てのゲームセッションの復元も実現します。DGS がクラッシュや障害で停止した場合、そこで動作していたゲームセッションは失われ、参加していた全てのプレイヤーは進捗を失います。Diarkis CSAR はサーバークラッシュ時に別サーバーへマイグレーションし、全てのゲーム状態とプレイヤー状態を維持したままプレイヤーが中断地点からプレイを続行できるようにします。
