基本コンセプト
アプリケーション
アプリケーションは、ゲームのサーバ側のロジックです。
ゲームのすべての機能(例:リモートプロシージャーコール、データ保存など)はPhotonのアプリケーションに実装されています。
C#のソースはコンパイルされ、得られたアセンブリは、Photonのネイティブコアによって読み込まれます。
アプリケーションを設定し開始パラメータを定義するために、Photon Coreは構成ファイルを使用します。
通常、ゲームのすべてのロジックは単一のアプリケーションで提供されます。
ただし、Photonは同時に複数のアプリケーションを実行することができます。
各アプリケーションは、個別のタスクを持つことができます。 たとえば、別のアプリケーションでウェブベースのクライアント用のポリシーファイルを送信することができます。
クライアントは接続時にアプリケーションの名前を指定して、 使用するアプリケーションを選択することができます。
ゲームロジック
ゲームロジックは、クライアントがどのようにサーバーとやり取りするかを定義します。
また、ゲームロジックはオペレーション、イベント、また、サーバーが単独でおこなうその他のことを実装しています。
ルームをベースとするゲームのための良い基盤は、SDKフォルダ("{ServerSDKpath}/src-server/Loadbalancing")内の"LoadBalancing Application"として提供されています。
単一の巨大なワールドが舞台のゲームの場合は、MMO Demo Application が良い基盤となります。
このアプリケーションはクライアントのインタレスト管理をおこない、アイテム、プロパティ、アクターなどへのクラスを提供します。
もしくは、すべてのゲームロジックはC#フレームワーク上に直接開発することができます。
このためのエントリポイントは"Photon.Socketserver.dll"で定義されるアプリケーションクラスです。
オペレーション
オペレーションとは、Photonではリモートプロシージャコールと同義です。
Photonのクライアントが処理をおこなうには、常にオペレーションの呼び出しを使用します。
オペレーションとそのすべてのパラメータは、必要に応じてサーバー側のアプリケーションで定義されます。
クライアントは、オペレーションの規則に合ったキーや値を持つハッシュテーブルを設定することで 任意のオペレーションを呼び出すことができます。
クライアントとサーバーのフレームワークが、シリアル化、転送および非シリアル化を行います。
各オペレーションは結果を提供することもできます。
これは、リクエストされたデータをクライアントに提供する方法の一つです。
もちろん、トラフィックを節減するために結果を省略することも可能です。
オペレーションの呼び出しと結果は1つのクライアントとサーバー
の間でおこなわれるものです。
他のクライアントには通知されません。
イベント
Photonイベントはクライアントのためのメッセージです。
各イベントはバイトコードで型付けされ、ゲームの更新をおこないます。
"LoadBalancing Application"はいくつかのイベントを定義しますが、 クライアント側のみでカスタムイベントを定義することが可能です。
オペレーションの結果とは異なり、受信したイベントは別のクライアントによるオペレーションの呼び出しから発生している可能性が高いです。
つまり:イベントはいつでも届く可能性があります。"LoadBalancing Application"は誰かがルームに入室または退室する際にイベントを送信します。
RaiseEvent オペレーションは、イベントを完全に共通のものにします:
いかなるクライアントもデータとハッシュテーブルを合わせ、送信時にコードを適用することで新しいイベントを作成することができます。
ゲームデータは、サーバーを変更することなく送信することができます。
もちろん、イベントに対するより複雑なサーバ側の反応を得たい場合には、イベントデータを確認、コンパイル、または他のイベントを作成するカスタムのオペレーションを定義することができます。
接続とタイムアウト
通常のUDPとは異なり、Photonの信頼性の高いUDPプロトコルは、サーバーとクライアント間の接続を確立します:
信頼性が高い場合、 UDPパッケージ内のコマンドにはシーケンス番号とフラグがあります。
その場合、受信側はコマンドを承認しなければなりません。
信頼性の高いコマンドは、確認レスポンスが到着するまで短い間隔で繰り返されます。
到着しない場合、接続はタイムアウトします。
双方は、個別にこの接続を監視します。
どちら側も、相手側がまだ使用可能かどうかを判断する独自のルールを持っています。
タイムアウトが検出された場合、 検出された側の接続が切断されます。
どちらか一方が相手側のレスポンスがないと判断したら、メッセージの送信はおこないません。
タイムアウトによる切断がどちらか一方でおこなわれ、同期されないのはこのためです。