PhotonFusion調べてみた~バーチャル空間を作るエンジニアに捧ぐ~
Photon Fusionとは
Unityでマルチプレイを実現しよう、そう思ったことがある人ならPhotonを知ってるもしくは触ったことがある人は多いのではないかと思う。Asset Storeで無料でアセットをダウンロードするだけで、簡単なマルチプレイ対戦を実現するPhoton PUNはUnityマルチ対戦の入り口として一番最初の選択肢ではないだろうか。
そんなPhoton PUNも実はリリースから10年近くが経っているらしく、あちらこちらに今では古い部分も散見される様になり、高速通信が求められるシビアなゲーム用にPhoton BOLTが開発されたりしていた。PUNとBOLTが提供していた役割をまとめて一つの役割にまとめ、新たなアーキテクチャを組んで提供したのがFusionだ。
2021年からベータ版が出され、2022年3月に正式版がリリースされたので、まだまだWeb上で調べても情報が出てきにくいので、今回自分が調べてわかったところをここでシェアしようと思う。
Photon PUNとの違い~メッセージ上限と想定ユーザ数~
まず、PUNについて日本語で参考になるドキュメントといえばo8queさんのこちらの資料だろう。https://zenn.dev/o8que/books/bdcb9af27bdd7d
基本的にPUNは開発当時にマルチプレイ対戦の主流だったMAX4人対戦のゲームに最適化されているのではないかと思う。その例の顕著なところがPhotonCloudの500Msg/s制限だ。PhotonCloudはユーザ感の通信をバイパスしてあげるリレーサーバーの役割を担う、共有サーバーだ。PUNでは仕様として全ての通信がリレーサーバーを通す使用になっており、実質的にP2P通信になっていない(ここ間違っていたらすみません、少なくともメッセージ数としては全てカウントされる、ということを伝えたかった)。なので例えば秒間30メッセージを1ユーザあたりに通信する場合、ユーザ数のニ乗でメッセージ数が増えていく(各ユーザが送信したデータを全ユーザが受信するため)。つまり4ユーザの場合、4(人) * 4(人) * 30(Msg)で480メッセージとなり、PhotonCloudの上限値に近くなる。このあたりをメッセージ数の上限として開発の際に想定されているのではないかと思う。
時は流れ、Fall Guysは60人、バトルロワイヤルFPSは100人など、今のゲームにおけるマルチプレイの想定人数はどんどん増えており、開発現場でそんなゲームを作ろう、なんて企画がどんどんなされているのではないかと思う。そういった時代の一つの解決策としてPhotonFusionが開発された流れだろうと思う。
PUNと同じ1ユーザがホストを担う形(FusionではHostモードという)でのゲームプレイだと、NAT超えができた場合はPhotonCloudを通す必要がない完全P2P通信になっており、メッセージ数のカウントに入らないことになっている。NAT超えがうまく行かなかった場合のみCloudを通してリレーするので、理論値だと200人同時通信が可能だとPhoton運営は宣伝している(実際開発者に聞いたところ、200人はセールス側の理論値だと言っていたw)。実際にはホストするユーザに負荷が相当かかるので、多人数でやる場合はHostは必ずPCである必要があったり、運営側が必ずHostになったりと言った裏技的対応は必要になると思われるが、完全P2Pで500メッセージ上限の制約が緩んだことはかなり朗報ではなかろうかと思う。
Photon Fusionの特徴~ティックベースシミュレーション~
Fusionの特徴は色々あるが、一番大きいのはティックベースシミュレーションでないかと思う。PUNの時は各ユーザが自分の状態をそれぞれのユーザに共有する、という仕様だったので、データのロールバックの仕組みがうまく行かなかったり(このへんは詳しくないので間違ってるかもしれない)、上で述べたようにデータ通信数が指数関数で増えていくのが課題だった。これを解決するために、ホストの役割担っているサーバーやクライアントがゲームの時間を管理し、それぞれのクライアントからの情報を元にそのゲーム時間において正しい状態を担保することができる。これによって正しい状態へのロールバックが可能になったのと、各クライアントがそれぞれの状態を全クライアントに送信する必要がなくなったため、通信が全部リレーサーバー(PhotonCloud)を通る場合でも、「ユーザ数の2倍×TickRate(秒間の1クライアントあたりの通信数)」になったため、ユーザ数が増えてもある程度対応できるようになった。
Photon Fusionの特徴~ネットワークトポロジー~
PUNの時はいわゆるHostモードしか選択肢がなかったというのが一般的な理解だが、実はこの理解は正しくないと思う。自分の理解ではPUNで実現していた機能をしっかりトポロジー別に定義し直してそれぞれのトポロジーで実現しやすいように構築し直した、という感じだと思う。
実際に上の図で言うServerモードのような使い方はPhotonServerというプラグインを使って自前もしくはPhoton運営が用意したDedicatedSeverを使うことで実現できていた(と思う)。違いはServerモードだとServerの役割を担うPC(通常はGameliftやPlayfabにゲームサーバーを立てて、Serverモードで使うパターンを想定することが最初は多いのではないかと思う)がプレイヤーにはならず、Unityのヘッドレスのインスタンスとしてゲーム管理のみを行うのがサーバーモードで、Hostモードだと1プレイヤーとしてHostも参加するという違いがある。
ちなみに開発者いわく、GameliftやらPlayfabで専用サーバーを立てるとものすごーく高くなるので、ほとんどのゲームにおいて採算が合わない場合が多いから、Serverモード使うならベアメタルサーバー(自前かクラウドに限らず)を使え、とのことだった。ただベアメタルサーバーでサーバーを構築するとなると、そこに対する難易度がバク上がりするので、Serverモード自体を使うこと自体結構ハードルが高いものと思われる。
Hostモードは先程上で説明したとおりだが、PUNのときと同様ホストクライアント方式を採用しながらも、P2Pによる通信が可能になったのでPhotonCloudのメッセージ上限の要件が実質緩くなった、という理解でいればよいのではないかと思う。
Sharedモードが全てのクライアントが状態権限を持っており(Hostモード/ServerモードではHostが状態権限を持っている。ややこしいがServerモードにおけるHostは専用サーバーが、HostモードにおけるHostは1クライアントが持っている)、自分の状態を常にPhotonCloudに通信しているだけである。全ての通信をPhotonCloudを介して行うのでその点は非常にPUNに似ている。違いはPhotonCloudがTiciRateの管理をしており(ただし状態権限は持っていない?)いるため、各クライアントはPhotonCloudと情報の受信/送信をするだけで良いので、ユーザ数に合わせて指数関数でメッセージ数が増えていくことはない。ここがPUNとの違いだろう。例えば、25(ユーザ) × 2(受信/通信) × 10(TickRate)で500メッセージというようなことが可能で、かなり同時通信できるユーザ数が増えたことがわかる。実際には通信エラーもあるので、もうすこしバッファが必要だが。
Photon Fusionの特徴?~補間機能Interpolation~
これがPUNの時にどのように作動していたのかはわからないので、Fusionを触った私の感想であるが、補間機能が素晴らしいと思う。(追加、o8queさんからのご指摘でPUNの頃から予測/補間の機能はあったとのことです)。上で10TickRateと聞いて、少ないと思った人もいるのではないだろうか。実際に10FPSで動かすとかなりカクつく。しかし、これは10TickRateつまり秒間10通信行う、という数値であって実際のゲーム上のFPSではない。例えば60FPSでゲームを行う場合、6コマに1回通信を行い、残りの5コマは予測によって、補間機能が働き、ユーザがプレイしている画面がカクつくことはない。実際対戦ゲームだと予測と実際の相手の位置がずれすぎていると問題なのでTickRateをもっと上げる必要があるだろうが、この補間機能が最大限生かせるのが対戦ゲームではない、メタバース空間などでの使用ではないだろうか。厳密な当たり判定が必要でないゲームやメタバース空間のようなところでのマルチプレイを想定する場合はTickRateを下げて補間機能に画面表示の部分は頼ることで、メッセージ数をあげずにユーザ数を増やすことが可能だ。
ただし、Photonの料金体系はゲームの使用に特化されているので、メタバース空間などの構築の場合、別料金となり割高になることには注意が必要だ。
裏技~500メッセージ数上限はくぐり抜けられる~
PUN時代から変わらず500メッセージ上限は続いているためこれがユーザ数を増やす上でPhotonを使う場合一番のネックになる場合が多いと思う。しかし知っている方も多いと思うが、500メッセージ数はソフト制限であり、500メッセージを超えてもそれが常態化しない場合はすぐに利用が停止されたりすることはない。実際にはメッセージ超えが常態化している場合は運営からメールが来て対応しないと停止されることもある、ということである。とはいえサービス化する上で、停止のリスクがあることは見逃せないのでどうすればよいのか、私も調べていて頭を抱えた。Hostモードの場合は上であげたようにほぼP2Pになるのでメッセージ上限を意識しなくてもいいかもしらないが。
「Premium Cloudを契約してくれて、メールしてくれれば500メッセージ上限を超えてても大丈夫なアカウントにしておくから大丈夫だよ」
とのことである。PremiumCloudとはPhotonCloudのPublicCloudの次のクラスの契約形態で最初から10万円を必ず払わないといけない。そういう面では高く付くのだが、GameliftやPlayfabを使うよりははるかに安く済むし、CCUが2000人を超えれば元が取れるのでサービス化を考えている方には問題にならないのではないかと思う。これは私が問い合わせてみた結果なので、実際にそれを試されたい方は日本の運営事務局もしくは海外のExitGamesの運営事務局(本体)に問い合わせてみることをおすすめする。
また、500メッセージ上限はクリアできても共有サーバー(PhotonCloud)の物理的もしくはシステム的な上限として帯域幅上限(調べてないので不明)やメッセージ数上限(こちらは自分がテストした限り2500メッセージ/秒あたりだった)があるので、そこは注意してほしい。500メッセージ上限は安定的にPhotonCloud上で通信する上での推奨メッセージ数であることには変わりはないようである。
まとめ
ということでPhotonFusionについて、具体的なコーディングの話というよりも設計の話をさせていただきました。日本語のこういった情報はまだまだ少ないので、皆さんの助けに少しでもなっていることを期待したい。
PhotonFusionの概要を知りたい方は運営事務局さんのセミナーを通してみるとなんとなく概要がわかると思う。
それでもわからない、もしくはもっと深く知りたいという場合はGamingCircleの無料トライアルを試してみることをおすすめする。英語オンリーで大変だと思うが、実際の開発エンジニアがコードなどもシェアしてくれながら質問に答えてくれるので、非常に有益だと思う。
また、Photonに限らず、Unityを使ってマルチプレイ用のネットワークを構築する手段はたくさんあると思うので、そちらに関しては下のこりんさんの記事をおすすめしたい。
以上!
Discussion