PUN2を使っていた自分から見て、Photon Fusionがどんなサービスか調べてみた - 概要編

PUN2を使っていたのですが、Photon Fusionを使っていこうと思い、何がどう違う感じになっているのか調べた内容をまとめてみました。プログラム的な内容は[こちら](https://qiita.com/matchyy/items/d19f4046ed3b5303374f)。
結果的にGameModeをSharedで利用することにしたので、そっちよりの情報になっています。

# Photon Fusionを一言で言うと
PUNの後継としつつも、マルチプレイをよりよく実装できるようにするために、ティックベースシミュレーションが導入されたサービス。

## PUNの後継なのか？
- 単純なPUNの後継ではなく、この後に出てくる決定論的な設計を目指しているかどうかで、設計思想が異なっていると感じている。
- ティックベースシミュレーションが追加されている
  - 各プレイヤーの状態に一貫性を持たせるためのシミュレーターがいる
    - 各プレイヤーの入力を受け取って、正となる状態を統括する役割を持つものがいる
  - 時間を等間隔に区切って、それぞれの時間でシミュレーションされた結果（状態）がある
  - 各プレイヤー毎にあるタイミングでは異なる状態になっている可能性があるが、それをシミュレーターから正の状態を受け取って整合性がある状態にロールバックすることなどができる
- これらのことを実現するために、GameModeの選択や、それに応じた各プレイヤーの権限が設定できるようになっている
  - PUN2ライクに使うならSharedを、ティックベースシミュレーションを使っていくならHostを選ぶことになる

## ティックベースシミュレーションと決定論的（シミューレーション）とPhoton Fusion
ティックベースシミュレーションは、ティックベースなので、固定された時間間隔で進行させる。決定論的シミュレーションは、同じ状態から始まり、同じ入力であれば、常に同じ結果が生成される。ティックベースシミュレーションであることで決定論的シミュレーションになるわけではないが、ティックベースシミュレーションにしたことで、決定論的シミュレーションのように入力を利用したシミュレーションを容易にして、各プレイヤーの結果を同じようにシミュレートできるようにしていくことを目指しているのが、Photon FusionのGameModeのHostなのだと感じている。

# 選択できるアーキテクチャ
## トポロジーとGameMode
PUN2ではここでいうSharedだったが、Fusionになったことで選択肢が増えている。

[The Quadrant](https://doc.photonengine.com/docs/img/quadrant.jpg) より。
![quadrant.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/7e137faf-bc21-72d2-35ee-f8609c1d4aa6.jpeg)

https://www.photonengine.com/ja-jp/fusion のフレキシブルなネットワークトポロジーより。
![スクリーンショット 2024-02-20 8.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/cffc9766-88ea-8aef-1bc7-59096c7cde4a.png)

### Determinisitic
決定論的・・・Quantum（下に補足あり）を使う場合なので、今回は割愛

### Dedicated Server
- 専用のサーバを運用するパターン
- サーバサイドで全クライアントの状態を管理する
- クライアントはサーバサイドに各々の入力を送信し、サーバサイドはその結果を全クライアントに送信する
   - 入力を送信するクライアントはいったん予測で処理して、サーバサイドから結果が返ってきたところで、再シミュレーションを行う
- 総じて、決定論的な設計を目指している、のだと思う

### Client Host（ホストモード / Host Mode）
- あるホストがサーバとクライアントを兼用するパターン
  - データの送受信にPhoton Cloudを利用するが、専用のサーバが不要となる
- ホスト（サーバサイド）となったクライアントが全クライアントの状態を管理する
- クライアントは・・・Dedicated Serverと同じ
- 総じて、決定論的な設計を目指している、のだと思う

### Shared（共有モード / Shared Mode）
- 全クライアントが自身の状態を管理しているパターン
  - データの送受信にPhoton Cloudを利用するが、専用のサーバが不要となる
- クライアントは自身の状態が変わったら、全クライアントに変更を送信する
  - 入力を受けて状態を変更したいするわけではないので、再シミュレーションなどはできない
- PUNと似ているのがこれ

### その他
- Photon Fusionの中では、HostかSharedを、GameModeとして選択する

### 補足：Photon Quantum とは何が違うの？
以下はQuantumの特徴。
- 決定論的であること
  - 同じ入力を与えると、必ず同じ出力が得られる ⇒ プレイヤーの入力さえわかれば、完全に正確なゲームの状態を予測することができる
  - Unityは決定論的ではない ⇒ Time.deltaTime が可変
  - Fusionは決定論的に実装することはできるかもしれないが、そうならないようにもできるという理解
- Fusionの上位互換というわけではない
- 独自の言語を利用している

## 権限（状態管理）
各GameModeで状態の管理の仕方異なるものの、誰が何を管理するのかが決まっていないと、どれが正の状態かわからなくなってしまう。そのためまずは権限の種類として何があるのか、そしてそれぞれのGameModeで誰がどの権限があるのかを知っておく必要がある。

[Fusion 2 イントロダクション](https://doc.photonengine.com/ja-jp/fusion/current/fusion-intro)の概要より。
![fusion-intro-api-overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e0ebc69c-9bb1-0ba8-90e4-92f452c6f553.png)

- Network Objectの下にある、以下3つが権限
    - Input Authority：操作などを入力する権限を持っている
    - State Authority：入力によって状態を確定する権限を持っている
    - Proxy：受け取り側
    - イメージとしてはHostモード
- Sharedの場合、全クライアントが自身の状態を管理している = Input AuthorityとState Authorityは各々のClientが併せ持っている感じになる。
    - Input Authority / State Authority ⇒ Proxy