クライアントの接続処理

Photonは、クライアント側で多くの点を管理するよう構築されています。 この機能によって、Photonはゲームループに円滑に統合されます。

原因不明な切断を避けるよう留意する必要があります。基本コンセプト内の「接続とタイムアウト」を併せて参照してください。 以下の情報を参照すれば、原因不明な切断を回避できます。

切断の理由

クライアントによる切断

  • クライアント側のタイムアウト (サーバーからの確認なし、またはサーバーからの確認が大幅に遅延)
    • 以下が含まれます: サーバーが実行しない場合
  • クライアントソケットの例外 (接続ロス)
  • 受信時にクライアント接続が失敗 (バッファフル、接続ロス)
  • 送信時にクライアント接続が失敗 (バッファフル、接続ロス)
  • 備考: localhostを使用する場合、C#はUDPにも例外を発生させます!

サーバーによる切断

  • サーバー側のタイムアウト (サーバーからの確認なし、またはサーバーからの確認が大幅に遅延)
  • サーバーがバッファフルを送信 (メッセージ数が過剰)
  • ライセンスまたは購入CCUの上限を超過

上記の他にも、クライアントが全く接続できない場合があります(不良なアドレス、DNSが利用不可)。 これらの場合はもともと接続していなかったため、切断とはみなされません。

サービスの呼び出しを維持

クライアントのゲームループにPhotonを含めるには、Serviceの定期的な呼び出しが必要です。 定期的とは、1秒間に10回から50回を意味します(ゲームまたはネットワーク利用に応じて)。

Serviceは2つのタスクを実行します:

  • 受信したイベントとデータが実行されます。 これはアップデートを処理可能な場合に実行されます。 シーケンスの順序は損なわれることなく常に維持されるため、クライアントが受信するものはすべてキューに入って順序づけられます。Serviceは、このタスクにDispatchIncomingCommandsを呼びます。
  • クライアントからの発信データがサーバーに送信されます。 これには(バックグラウンドで作成される)確認が含まれ、この確認はサーバーへの接続を維持するうえで重要です。 サービスはこのタスクを処理するため、内部的にSendOutgoingCommandsを呼びます。SendOutgoingCommandsコールの頻度を管理することで、クライアントが作成したデータを送信するのに使用するパッケージの数が制御されます。

サービスコールのプロファイリング

定期的にServiceを呼んだか検知するため、クライアントAPIには統計モジュールが追加されています。

切断が発生する場合には、まずこれらの値を確認してください:

統計がオンになっている場合(PhotonPeer.TrafficStatsEnabled = true)、PhotonPeer.TrafficStatsGameLevelDispatchIncomingCommandsSendOutgoingCommandsが呼ばれた頻度をトラッキングしています。 LongestDeltaBetweenSendingLongestDeltaBetweenDispatchingの値を確認してください。

現在、この機能はC#ベースのライブラリに実装されています。 その他のプラットフォームにも近日中に実装される予定です。

プラットフォーム固有の情報

Photon Unity SDK

Photon Unity SDKを使用する場合、MonoBehaviourUpdateメソッドでServiceコールを実行することがあります。

シーンをローディングする際にPhoton クライアントのSendOutgoingCommandsが呼ばれているか確認するには、バックグラウンドスレッドを実装してください。 このスレッドは各ループごとに100または200ミリ秒間、一時停止します。このため、パフォーマンス全体に影響するわけではありません。

 ドキュメントのトップへ戻る