リージョン
Photon Cloudは、世界中で低レイテンシのゲームを実行するための、グローバルな通信基盤を提供します。
これは、様々なリージョンでサーバーをホスティングすることで実現されています。
利用可能なリージョンは、プロジェクトの運用期間を通じて変わる可能性があります。クライアントは、Photonのネームサーバーから最新のリージョンのリストを取得できます。
各リージョンは、他のリージョンと完全に分離されています。リージョンは、マスターサーバー(マッチメイキング用)とゲームサーバー(ルームのホスト)で構成されます。
利用可能なリージョンのリストは、製品ごと(Fusion、Quantum、Chatなど)に異なります。
リージョン許可リストによって、AppIdごとにどのリージョンを利用可能にするかを定義することができます(後述)。
利用可能なリージョン
Photon Cloudは、いくつかのリージョンのサーバーで構成されており、世界中の複数のホスティングセンターに分散しています。
一部のリージョンのサーバーは、特定の製品やクライアントSDKにのみ対応しています。例えば、Fusionは日本リージョンを使用できますが、Chatは使用できません。
Photon Cloudの各リージョンは「リージョントークン」で識別され、大文字小文字を区別しない短い文字列です。例えば、「EU」と「eu」はどちらも有効で、同じヨーロッパリージョンを指します。
リージョントークンをクライアントの「Connect」メソッドで渡すには、以下を呼びます:
C#
loadBalancingClient.ConnectToRegionMaster(regionString);
リージョン | ホスティング場所 | トークン |
---|---|---|
アジア | シンガポール | asia |
オーストラリア | シドニー | au |
カナダ(東) | モントリオール | cae |
中国本土 (こちらをご覧ください) | 上海 | cn |
ヨーロッパ | アムステルダム | eu |
香港 | 香港 | hk |
インド | チェンナイ | in |
日本 | 東京 | jp |
南アフリカ | ヨハネスブルグ | za |
南米 | サンパウロ | sa |
韓国 | ソウル | kr |
トルコ | イスタンブール | tr |
アラブ首長国連邦 | ドバイ | uae |
アメリカ(東) | ワシントンD.C. | us |
アメリカ(西) | サンノゼ | usw |
アメリカ(南中部) | ダラス | ussc |
リージョン許可リスト
いくつかの理由から、プレイヤーやユーザーが利用可能なリージョンを制限したいことがあります(後述)。
リージョン許可リストによって、アプリケーションごとに、ダッシュボードから有効なリージョンを編集できます。クライアント側の変更は不要です。
ダッシュボードを開き、アプリケーションの「詳細へ」をクリックした後、リージョン許可リストの「編集」をクリックしてください。
すると、許可するリージョンのリストを入力できる入力欄が表示されます。
- 有効なリージョンはSDKごとに定義されていて、Industries Circleでは異なることがあります
- 許可リストは、セミコロンで区切られたリージョントークンの文字列(例:"eu;us")です
- リージョントークンは、大文字と小文字を区別しません
- 定義されていない/認識できないリージョントークンは、リストから無視されます
- 空("")または不正な文字列(例:";;;")は、全ての利用可能なリージョンが許可されます
変更(入力後に保存)してから10分以内に、フィルタリングされたリストが、ネームサーバーに接続中のクライアントに送信されるようになります。
クライアント側とのコンフリクトを避けるため、Ping最小値の「ベストリージョン」に接続する、または受信したリージョンリストからリージョンを選択するようにしてください。
リージョンの選択方法
アメリカにいるユーザーは、Photon Cloud USリージョンに接続すれば、レイテンシは最小になります。それだけなら簡単です。
では、世界中にユーザーがいる場合はどうすれば良いでしょう?
その場合は、以下のいずれかを選択できます。
- a) 様々なPhoton Cloudリージョンにpingを送信し、最適なリージョンをあらかじめクライアントに選択させる(こちらをご覧ください)
- b) リージョンごとのビルドを配布して、異なる地域のユーザーを異なるPhoton Cloudリージョンに接続させる
- c) ゲームのUI内で、リージョンをユーザーに選択させる
- d) 高レイテンシが許容されるゲーム(それほどリアルタイムではないゲーム)なら、全てのユーザーを同一のリージョンに接続させる
Photon Cloudを使用するアプリケーションは、全ての利用可能なリージョンで動作し、追加料金はかかりません。価格プランをご覧ください。
Photon Cloudのダッシュボードでは、各リージョンでのゲームの利用状況をモニタリングでき、簡単にプランをアップグレード/ダウングレードすることができます。
C# Realtime API
Photon Realtime(ほとんどのPhotonのSDKで使用されています)は、接続すべきベストリージョンを検知でき、プレイヤーがそのリージョンへの接続を保持できるようにします。
これを実現するため、クライアントは接続時に接続可能なリージョンのリストをネームサーバーから常に取得します。
サーバーからの応答はLoadBalancingClient.RegionHandler
の設定に使用されます。LoadBalancingClient.RegionHandlerは、
IConnectionCallbacksで定義されるとおり、
OnRegionListReceived(RegionHandler regionHandler)`もコールバックによって提供されます。
通常、次のステップはregionHandler.PingMinimumOfRegions()
を呼び、各リージョンへの最新のpingを検出することです。完了時には、呼び出すメソッドを渡す必要があり、最良のケースでは、以前の実行から「ベストリージョン・サマリー」を渡すこともできます(以下で説明します)。
サーバーへのping送信後、結果は後で使用できるようregionHandler.SummaryToCache
に要約され、デバイス上に保存されます。
以前のセッションのSummaryToCache
がなければ、すべてのリージョンがpingされますが、所要時間が長くなります。
以前の結果が利用可能な場合、クライアントは以下を確認します:
a. リージョンリストが変更された場合(「以前のベストリージョン」がまだ利用可能な場合に対応)
b. pingが受け入れられなくなった場合(以前に保存された参照値よりも1.5倍以上遅い)
どちらかが該当する場合、すべてのリージョンがpingされ、新しい結果が選択されます。
ベストリージョンを使用すると、ダッシュボード内のサーバー側のリージョンフィルタと連携します。この機能によって、プレイヤーが利用可能なリージョンがオンデマンドで更新されます。
リージョンのリストにアクセスする場合、または前回の結果を上書きする場合には、リージョンのAPIリファレンスを参照してください。
ベストリージョンの検討
「ベストリージョン」オプションは、決定的なものではありません。
リージョンにあまり差がない場合や、まったく同じping計算がされた場合には、「ランダム」になる可能性があります。
理論上は以下の設定が可能です:
- 同一デバイスから、複数リージョンに対してまったく同じpingを設定します。同じネットワークに接続したクライアント上で異なるリージョンに接続する場合には、ランダムになります。
- 同じネットワークに接続した異なるデバイス上(または同じデバイス上で異なる試行を実行する)で、同じリージョンに対して異なるping値を設定します。
たとえば、「us」と「usw」(または「ru」と「rue」)の場合、オンラインリージョンの許可リストを使用してリージョンを選択するか、または明示的にリージョンに接続します。
デバッグをおこなうには、ロギングレベルを「情報」に設定し、「現在のベストリージョン」をクリアしてください(PUNの場合:PhotonNetwork.BestRegionSummaryInPreferences = null)。詳細を参照するか、またはメールでログを送信してください。
特定のマスターサーバーへの接続
包括的なリージョンのマスターサーバーアドレスを使用したマスターサーバーへの直接接続は、推奨されていません。 その代わりに、使用中のSDKによって提供されるリージョンマスターに接続するメソッドを使用してください!
クライアントから最寄りのリージョンが分かっている場合には、リージョンコードを渡すだけでそのリージョンに接続可能です。
C#
loadBalancingClient.ConnectToRegionMaster("us")
その他のプラットフォームについては SDKのリストで、各SDKおよびAPIからリンクを開いてください
SDKは、ネームサーバーからリクエストされたサーバーへのマスターサーバーアドレスを取得します(図「Photon Cloudリージョンへの接続」の1)。その後、選択したリージョンのマスターサーバーに自動的に接続します(図「Photon Cloudリージョンへの接続」の2)。
リージョンリストを表示する方法
実行時にリージョンを選択する場合(例:利用可能なリージョンのリストをプレイヤーに表示し、プレイヤーにリージョンを選択させる場合)、まずネームサーバーに接続する必要があります。
ネームサーバーにクエリを実行し、現在利用可能なリージョンのマスターサーバーアドレスのリストを取得できます(図「Photon Cloudリージョンへの接続」の1)。
ネームサーバー」についてですが、ネームサーバーには利用可能なリージョン間で地理的にロードバランスが実行されます。 これによって、マスターサーバーのアドレスのリクエストにかかる時間が最低限に抑えられます。
C#クライアントSDK
C#
loadBalancingClient.ConnectToNameServer()
正常に接続すると、内部的にLoadBalancingClient.OpGetRegions()
が呼ばれます。結果的にloadBalancingClient.RegionHandler
が設定され、それがコードに実装されコールバックが登録されている場合にはOnRegionListReceived
を呼びます。
C#
loadBalancingClient.OpGetRegions()
マスターサーバーのリストをもとにすべてのマスターサーバーにpingを送信でき、最低レイテンシーのゲームプレイを実現するうえでベストリージョンを把握できます。または、プレイヤーにリージョンを選択させることが可能です。これはRegionHandler.PingMinimumOfRegions()
によっておこなえます。
クライアントがリージョンを決定したら、そのリージョンのマスターサーバーに接続します(図「Photon Cloudリージョンへの接続」の2)。
C#
loadBalancingClient.ConnectToRegionMaster("us")
最後に、ルームに参加するかまたはルームを作成します(図「Photon Cloudへのクライアント接続」の3)。
C++クライアントSDK
クラス
Client
のコンストラクターには、いくつかの任意のパラメータがあります。
このうちの最後、regionSelectionMode
のデフォルト値はRegionSelectionMode::DEFAULT
で、LoadBalancing::RegionSelectionMode
のいずれかの値をとります。
このパラメータには明示的にRegionSelectionMode::SELECT
を渡してください。Client::connect()
へのコールによってトリガーされた接続フローの際、クライアントはネームサーバーから利用可能なリージョンのリストを受信します。
Listener
は任意でListener::onAvailableRegions()
コールバックを宣言します。
regionSelectionMode
にRegionSelectionMode::SELECT
を渡した場合には、Client
は利用可能なリージョンのリストから項目を自動的には選択しませんが、そのコールバックにそのリストが渡されます。
このためListener
を実装する場合には、あらゆる基準にもとづいてリージョンを選択する意味のある実装で、そのコールバックのデフォルトの空の実装を上書きする必要があります。リージョンを選択するまで、接続フローは完全に一時停止します。
接続フローを続行するため、選択したリージョンを
Client::selectRegion()
に渡します。
注:
Client::selectRegion()
はListener::onAvailableRegions()
へのコールを受信した場合にのみ呼び出されることが想定されています(このコールバック内で直接、またはコールバックが返された後に selectRegion()
を呼んでください)。
Listener::onAvailableRegions()
へのコールを受信していない場合には、クライアントはリージョン選択の接続フローで正常な段階に達することができません。
Listener::onAvailableRegions()
の実装例は、クライアントSDK内のdemo_loadBalancingのソースコードを参照してください。
C++
void NetworkLogic::onAvailableRegions(const ExitGames::Common::JVector<ExitGames::Common::JString>& availableRegions, const ExitGames::Common::JVector<ExitGames::Common::JString>& availableRegionServers)
{
EGLOG(ExitGames::Common::DebugLevel::INFO, L"%ls / %ls", availableRegions.toString().cstr(), availableRegionServers.toString().cstr());
mpOutputListener->writeLine(L"onAvailableRegions: " + availableRegions.toString() + L" / " + availableRegionServers.toString());
// select first region from list
mpOutputListener->writeLine(L"selecting region: " + availableRegions[0]);
mLoadBalancingClient.selectRegion(availableRegions[0]);
}
selectRegion()
はonAvailableRegions()
へのコールを受信後にのみ、接続フロー内で呼ばれる点に留意してください。
任意のタイミングでselectRegion()
を呼んだり、onAvailableRegions()
への単一のコールに対して複数回selectRegion()
を呼ぶことはサポートされておらず、未確認の挙動が発生します。
Objective-C クライアント SDK
クラス
EGLoadBalancingClient
のコンストラクターには、いくつかの任意のパラメータがあります。
このうちの最後、regionSelectionMode
のデフォルト値はEGRegionSelectionMode_DEFAULT
で、EGRegionSelectionMode.h
のうちいずれかの値をとります。
このパラメータには明示的にEGRegionSelectionMode_SELECT
を渡してください。EGLoadBalancingClient::connect()
へのコールによってトリガーされた接続フローの際、クライアントはネームサーバーから利用可能なリージョンのリストを受信します。
EGLoadBalancingListener
は任意のEGLoadBalancingListener::onAvailableRegions()
コールバックを宣言します。
regionSelectionMode
にEGRegionSelectionMode_SELECT
を渡した場合には、EGLoadBalancingClient
は利用可能なリージョンのリストから自動的に項目を選択しませんが、そのコールバックにリストが渡されます。
このためEGLoadBalancingListener
を実装する場合には、あらゆる基準にもとづいてリージョンを選択する意味のある実装で、そのコールバックのデフォルトの空の実装を上書きする必要があります。リージョンを選択するまで、接続フローは完全に一時停止します。
接続フローを続行するため、選択したリージョンを
EGLoadBalancingClient::selectRegion()
に渡します。
注:
EGLoadBalancingClient::selectRegion()
は、EGLoadBalancingListener::onAvailableRegions()
へのコールを受信した場合にのみ呼び出されることが想定されています(このコールバック内で直接、またはコールバックが返された後にselectRegion()を呼んでください)。
EGLoadBalancingListener::onAvailableRegions()へのコールを受信していない場合には、クライアントはリージョン選択のための接続フローで正常な段階に達することができません。
EGLoadBalancingListener::onAvailableRegions()
の実装例は、クライアントSDK内のdemo_loadBalancing_objcのソースコードを参照してください:
Objective-C
- (void) onAvailableRegions:(EGArray*)availableRegions :(EGArray*)availableRegionServers
{
NSString* r = [availableRegions componentsJoinedByString:@", "];
NSString* s = [availableRegionServers componentsJoinedByString:@", "];
EGLOG(EGDbgLvl::INFO, L"onAvailableRegions: %ls / %ls", [r UTF32String], [s UTF32String]);
[mOutputListener writeLine:@"onAvailableRegions: %@ / %@", r, s];
// select first region from list
[mOutputListener writeLine:@"selecting region: %@", availableRegions[0]];
[mLoadBalancingClient selectRegion:availableRegions[0]];
}
selectRegion()
はonAvailableRegions()
へのコールを受信後にのみ、接続フロー内で呼ばれる点に留意してください。
任意のタイミングやステートでselectRegion()を呼んだり、onAvailableRegions()
への単一のコールに対して複数回selectRegion()を呼ぶことはサポートされておらず、未確認の挙動が発生します。
中国本土のリージョンを使用
ファイアウォールによってトラフィックがブロックされる可能性があるため、中国ローカルのPhotonネームサーバーを使用する必要があります。
中国のPhotonネームサーバーは「ns.photonengine.cn」です。
中国本土外からクライアントに接続しても、良い結果は得られません。
また、Photonサーバーから中国本土外のサーバーへの接続(例:カスタム認証、WebHook、WebRPCなど)の信頼性は高くありません。
また、法的な理由から、中国向けには個別のビルドが必要となり、個別のAppIdの使用を推奨します。
例えば、ビルドごとにAppIdやPhotonネームサーバーを変更するために、(任意の)条件コンパイルを使用してください。
中国マーケット用に特別なビルドを作成するには、お使いのクライアントSDKのマニュアルをご覧ください。
C# Client SDKs
C#
void ConnectToChina()
{
AppSettings chinaSettings = new AppSettings();
chinaSettings.UseNameServer = true;
chinaSettings.ServerAddress = "ns.photonengine.cn";
chinaSettings.AppIdRealtime = "ChinaRealtimeAppId"; // TODO: replace with your own Realtime AppId unlocked for China region
chinaSettings.AppVersion = "ChinaAppVersion"; // optional
loadBalancingClient.ConnectUsingSettings(chinaSettings);
}
C++クライアントSDK
- Client::connect()
へのパラメータ
serverAdress`に「ns.photonengine.cn」を渡します。 - パラメータ
serverType
がServerType::NAME_SERVER
のデフォルト値を保持するよう、留意してください。
Objective-CクライアントSDK
EGLoadBalancingClient::connect()
で、パラメータserverAdress
にns.photonengine.cnを渡す。- パラメータ
serverType
はデフォルト値EGServerType_NAME_SERVER
のままにしてください。