server | v5 switch to v4  

よくある質問

目次

どのPhoton製品を使用するべきでしょうか?

対象となるゲームやプロジェクトの特性によって異なります。

通常、弊社はFusion または Quantumの使用を推奨しています。これらは、弊社のもっとも高度なクライアントソリューションです。

概要について、どちらの製品シートにも製品選びのための「Quadrant」が記載されています:

また、Photon CloudとPhoton Serverのどちらを選択すべきかは、こちらを参照ください。

ご不明点はお気軽にお問合せください。

トップに戻る
 

切断後すぐにルームに再び参加する方法は?

ルームへの参加中に発生した予期しない切断から回復するために、クライアントはルームへの再接続と再参加を試みることができます。 これを「クイック再入室」と呼びます。 クイック再入室は、次の場合にのみ成功します:

  • ルームは同じサーバー上にまだ存在するか、読み込めます: プレイヤーが退室しても、他のプレイヤーがまだ参加している場合、後者はPhotonサーバー上で生き続けることができます。 プレイヤーが最後に退出し、ルームが空になった場合、EmptyRoomTTLは、プレイヤーが参加または再参加するのを待機している時間です。 EmptyRoomTTLの後、ルームがまだ空で、誰も参加していない場合、Photonサーバーから削除されます。 永続化条件が満たされ、Webhookがセットアップされている場合、ルームの状態を構成済みのWebサービスに保存して、後で読み込むことができます。
  • アクターは内部でインアクティブとしてマークされます。同じUserIdを持つアクターがアクターのリスト内に存在しますが、現在ルームに参加していません。 これには、PlayerTTLが0と異なる必要があります。
  • インアクティブなアクターのPlayerTTLが期限切れになりませんでした。アクターが戻ってくるオプションを選択してルームを出ると、インアクティブ化タイムスタンプを保存します。 ルームが稼働している限り、インアクティブ化時間からPlayerTTLミリ秒が経過すると、それぞれのアクターがアクターのリストから削除されます。 それ以外の場合、アクターが再入室を試みるときに、再入室の試行時間とインアクティブ化時間のミリ秒単位の差がPlayerTTLを超えると、アクターはアクターのリストから削除され、再入室は失敗します。 そのため、インアクティブなアクターは、インアクティブ化時間の後、PlayerTTLミリ秒だけルームに再入室できます。

「クイック再入室」は2つのステップで構成されます。

  • Reconnect: 切断されたら、適切な接続メソッドを呼び出すだけです。
  • Rejoin: loadBalancingClient.OpRejoin(roomName)を呼び出します。

トップに戻る
 

Threading

トップに戻る
 

レース状態やその他のマルチスレッドの問題を回避する方法は?

Photonでは、可能な限りシンプルにすることを心がけました:

  1. 任意のスレッドからPhotonPeerメソッドを使用できます。
  2. PhotonPeerからのすべての通知は、1つのファイバーで実行されます(ファイバーについては、以下を参照してください)。
  3. ルーム内のすべてのタスクは1つのファイバーで実行されます。
  4. ピアは、マルチスレッドの問題からデータを保護するために、ルームのファイバーにメッセージを送信します。

ファイバーは、FIFO方式で1つずつ順番に実行されるタスクのリストです。 これは、それらが1つのスレッドで実行されることを意味しません。 実際には、多くのスレッドで実行されますが、1つずつ実行されます。 したがって、最初のタスクはスレッドAで実行され、終了すると、2番目のタスクはスレッドBで実行されます。 ただし、特定の瞬間に1つのスレッドだけがルームデータにアクセスします。 多くのファイバーが同じデータにアクセスする場合、ロックを使用します。 たとえば、ルームのキャッシュ内の場合です。

次のようにファイバーを使用できます:

// rooms contructor
someFiber = new PoolFiber(); // create new fiber
someFiber.Start();
someFiber.ScheduleForInterval(someRepetitiveRoutine, 0, 100); // start immediately and repeat every 100 ms, ie 10 times per second. this params may vary as you need
// at some other point, where you need to add more logic to the fiber
someFiber.Enqueue(newTask);
someFiber.Enqueue(()=>{ anotherTask(parameters);});
// from the tasks you can send messages to the room e.g. to notify the room of a result of a task
room.EnqueueMessage(new YourCustomMessage(somethingToSend));

同じコードまたは同じデータを共有する複数のカスタムファイバーを使用する場合、異なるファイバーのアクションが同時に実行されるため、アクセスを同期する必要があることに注意してください。

トップに戻る
 

ログの記録


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