Regions

Photon Cloud為您提供全球連接,讓您在世界各地進行低延遲遊戲。

客戶端的初始連接會進入Photon名稱伺服器,該伺服器提供可用區域的列表。

每個地區都是完全獨立的,由一個主伺服器(用於匹配)和遊戲伺服器(主持房間)組成。

photon cloud regions' connect flows
連接到Photon Cloud地區

下面是可用區域的完整列表。 在介面上,您可以定義哪些區域對客戶可用。

最佳區域選擇

PUN和Photon Voice依靠實時API層來選擇最佳區域。

C# Realtime API

Photon Realtime可以檢測到要連接的最佳區域,並使您能夠堅持使用該區域。

為了做到這一點,客戶端總是在連接時從名稱伺服器獲取可用區域的列表。 這是用來獲取最新的區域列表,並檢查保存的最佳區域(如果有的話)是否仍然可用。

ping伺服器後,結果被總結為一個字符串,應保存在設備上供以後使用。 摘要字符串包括當前的最佳區域、其ping和當前的區域列表。

如果沒有以前的結果,所有區域都會被ping,這需要多花點時間。 如果有以前的結果,客戶端將檢查。

a. 區域列表是否改變(包括”以前的最佳區域”是否仍然可用的情況)。 b. 如果ping不再是可接受的(>=1.5倍於先前保存的參考值的速度)。

如果這兩種情況都適用,所有地區都會被ping,並挑選出一個新的結果。

使用最佳區域與控制面板中的伺服器端區域過濾器配合得很好。 它使您能夠根據需要改變玩家可用的地區列表。

要訪問地區列表或覆蓋以前的結果,請參考地區的API參考值。

最佳區域考慮因素

"Best Region" option is not deterministic. Sometimes it may be "random" due to little variations or exact same ping calculations.

Theoretically, you could:

  • have the same exact ping to multiple regions from the same device. So its random, if you end up with different regions on clients connected to the same network.
  • different ping values for the same region on different devices (or different retries on the same device) connected to the same network.

For instance, in the case of "us" and "usw" (or "ru" and "rue"), you could either make use of the online regions whitelist to select the ones you want and drop the others or connect to an explicit region.

可用地區

Photon Cloud在多個地區都有伺服器,分布在世界各地的多個主持中心。

每個Photon Cloud區域都由一個”區域令牌”來標識。

要用您的客戶端的”連接”方法傳遞區域令牌,請呼叫:

C#

    loadBalancingClient.ConnectToRegionMaster(regionString);

可用區域和令牌的列表:

區域標記(或代碼)的字符串是不區分大小寫的。例子:"EU”或”eu”都可以接受,並且指的是同一個歐洲地區。

地區託管在令牌
亞洲新加玻asia
澳大利亞墨爾本au
中國大陸1 (查看說明)上海cn
歐洲阿姆斯特丹eu
印度欽奈in
香港香港hk
日本東京jp
South AfricaJohannesburgza
南美洲聖保羅sa
韓國首爾kr
TurkeyIstanbultr
United Arab EmiratesDubaiuae
美國東部華盛頓特區us
美國西部聖何塞usw
USA, South CentralDallasussc
1: 中國大陸需要單獨的 AppId 和訂閱。

介面區域過濾

您可以直接從介面上過濾每個應用程式的可用Photon Cloud區域列表。

photon cloud: regions whitelist
過濾Photon Cloud區域

進入介面,然後點擊所選應用程式的”管理",再點擊”編輯"。 您會發現一個輸入字段,您可以在那裡輸入白名單區域的列表,如下所示:

  • 允許的列表應該是一個由分號分隔的地區標記的字符串,例如”eu;us"。
  • 地區標記不區分大小寫,並被定義為這裡
  • 未定義或未識別的區域標記將從列表中被忽略。
  • 空("")或畸形的字符串(如";;;")表示空列表。
  • 空列表意味著所有可用的區域都被允許。

一旦您確認並保存,NameServer將只返回過濾後的區域列表。 因此,客戶應該從該列表中選擇。 考慮到介面的更新可能需要10分鐘。

如何選擇一個地區

美國的用戶如果連接到Photon Cloud美國地區,則延遲最低。簡單。

但是,如果您的用戶來自世界各地,怎麼辦?

您可以

  • **a)**讓遊戲客戶端在不同的Photon Cloud地區進行ping,並預先選擇一個有最佳ping的地區,請閱讀我們的how-to
  • **b)**將客戶端的構建與地區挂鉤,因此來自不同地區的用戶連接到不同的Photon Cloud地區,或者
  • **c)**讓用戶在您的遊戲界面中選擇一個匹配的區域。

另外,您也可以**d)**讓所有用戶連接到同一個區域,如果較高的延遲對您的遊戲來說是可以接受的,例如任何”非實時”遊戲。

所有的Photon Cloud應用程式都可以在所有可用的地區工作,不需要任何額外的費用。 見定價。

Photon Cloud的介面可以讓您監控您的遊戲在各個地區的使用情況,並輕鬆升級或降級您的訂閱計劃。 進入您的介面。

如何以最低的延遲開始您的遊戲

photon cloud regions' connect flows
連接到Photon Cloud地區

連接到最近的主伺服器

使用通用的區域主伺服器地址直接連接到主伺服器的做法已被廢棄。 相反的,請使用您所使用的SDK所提供的方法來連接到區域主伺服器!

如果您知道您的客戶端要連接的最近的區域,您可以只通過區域來連接它。

C#

    loadBalancingClient.ConnectToRegionMaster("us")

*對於其他平台,請從SDKs列表*鏈接到相應的SDK和API。

SDK會從名稱伺服器中為您獲取請求區域的主伺服器地址(圖中1為“連接到Photon Cloud區域”),然後自動將您連接到所選區域中的主伺服器上(圖中2為“連接到Photon Cloud區域”)。

H如何在執行時選擇一個區域

如果您想在執行時選擇地區-例如,通過向玩家顯示可用的地區列表,讓他們選擇-您需要先連接到名稱伺服器。 然後您可以向名稱伺服器查詢當前可用的地區主伺服器地址列表(圖中1為“連接到Photon Cloud區域”)。

。 雖然我們寫的是”名稱伺服器",但名稱伺服器在地理上對可用區域進行了負載平衡。 這使得請求主伺服器地址的時間盡可能的縮短。

C#客戶端SDKs

C#

    loadBalancingClient.ConnectToNameServer()

連接成功後,您會得到可用區域的列表。

C#

    loadBalancingClient.OpGetRegions()

有了主伺服器的列表,您現在可以ping所有的伺服器,以找出連接到最低延遲遊戲的最佳區域,或者讓您的玩家選擇一個區域。

當您的客戶端確定了區域後,連接到該區域的主伺服器(圖中2為“連接到Photon Cloud區域”)。

C#

    loadBalancingClient.ConnectToRegionMaster("us")

最後,為您的遊戲加入或創建一個房間(圖中3為“連接到Photon Cloud區域”)。

C++客戶端SDKs

  1. 類別Client的構造函數有幾個可選參數。 其中最後一個叫做regionSelectionMode,從LoadBalancing::RegionSelectionMode中獲取一個值,默認為RegionSelectionMode::DEFAULT。 明確傳遞RegionSelectionMode::SELECT作為該參數。

  2. 在呼叫Client::connect()觸發的連接流程中,客戶端從名稱伺服器接收可用區域的列表。 Listener聲明了一個可選的呼叫返回Listener::onAvailableRegions()。 如果您為regionSelectionMode傳遞了RegionSelectionMode::SELECT,那麼Client不會自動在可用區域列表中選擇一個專案項目,而是將該列表傳遞給該呼叫返回。 因此,在您的Listener執行中,您應該用一個有意義的執行來覆蓋該呼叫返回的空默認執行,根據您能想到的任何標準來選擇一個區域。

  3. 連接流完全暫停,直到您選擇了一個區域。

  4. 將您選擇的區域傳遞給Client::selectRegion()以繼續連接流程。

注意: Client::selectRegion()只有在收到對Listener::onAvailableRegions()的呼叫後才會被呼叫(在這個呼叫返回中直接呼叫selectRegion(),或者在呼叫返回返回後呼叫)。 否則,客戶端將不在連接流的正確階段進行區域選擇。

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()的呼叫後被呼叫。 不支持在其他時間或狀態下呼叫它,或者為一次呼叫onAvailableRegions()而多次呼叫它,這會產生未定義的行為。

物件導向-C客戶端SDKs

  1. 類別EGLoadBalancingClient的構造函數有幾個可選參數。 其中最後一個叫做regionSelectionMode,從EGRegionSelectionMode.h中獲取一個值,默認為EGRegionSelectionMode_DEFAULT。 明確傳遞EGRegionSelectionMode_SELECT作為該參數。

  2. 在呼叫EGLoadBalancingClient::connect()引發的連接流程中,客戶端會從名稱伺服器收到可用區域的列表。 EGLoadBalancingListener聲明了一個可選的呼叫返回EGLoadBalancingListener::onAvailableRegions()。 如果您把EGRegionSelectionMode_SELECT作為regionSelectionMode,那麼EGLoadBalancingClient不會自動在可用區域列表中選擇一個專案項目,而是把列表傳給呼叫返回。 因此,在您的EGLoadBalancingListener執行中,您應該用一個有意義的執行覆蓋該呼叫返回的空默認執行,根據您能想到的任何標準來選擇一個區域。

  3. 連接流程完全暫停,直到您選擇了一個區域。

  4. 將您選擇的區域傳遞給EGLoadBalancingClient::selectRegion(),以繼續連接流程。

注意: EGLoadBalancingClient::selectRegion()只有在收到對EGLoadBalancingListener::onAvailableRegions()的呼叫後才能被呼叫(在此呼叫返回中直接呼叫selectRegion(),或在呼叫返回返回後呼叫)。 否則,客戶端將不在連接流的正確階段進行區域選擇。

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()的呼叫後被呼叫。 不支持在其他時間或狀態下呼叫它,也不支持在呼叫”onAvailableRegions()”時多次呼叫它,這會產生未定義行為。

使用中國大陸地區

您需要為您的Photon應用申請進入中國大陸地區的權限。向我們發送電子郵件,以便我們為您的應用ID解鎖。
您不能通過我們的網站訂閱在中國大陸地區使用的付費計劃。 請通過電子郵件與我們聯繫,以獲得任何訂閱的報價。

Photon名稱伺服器必須是中國本地的,否則防火牆可能會阻止流量。 中國的Photon名稱伺服器是”ns.photonengine.cn"。

與中國大陸以外的客戶連接,很可能不會產生好的結果。 另外,從Photon伺服器連接到中國大陸以外的伺服器(如自定義認証、WebHooks、WebRPCs)可能不可靠。

重要:在當前階段,您通過介面對您的應用程式所做的更改不會自動反映在中國的應用程式緩存中。 如果您在那裡有更新請求,請通過電子郵件告訴我們。

另外,出於法律原因,您需要為中國單獨構建一個應用程式,我們建議使用一個單獨的AppId。 例如,使用一個編譯條件(由您選擇)來改變AppId和Photon名稱伺服器,取決於構建。

請按照您的客戶端SDK的說明,為中國市場制作一個特殊的版本。

C#客戶端SDKs

C#

void ConnectToChina()
{
    AppSettings chinaSettings = new AppSettings();
    chinaSettings.UseNameServer = true;
    chinaSettings.ServerAddress = "ns.photonengine.cn";
    chinaSettings.AppIdRealtime = "ChinaRealtimeAppId"; // TODO: 替換為您自己為中國地區解鎖的實時 AppId
    chinaSettings.AppVersion = "ChinaAppVersion"; // 可選的
    loadBalancingClient.ConnectUsingSettings(chinaSettings);
}

C++客戶端SDKs

  • 將”ns.photonengine.cn”作為參數serverAdress傳給Client::connect()
  • 請確保將參數serverType保持在默認值ServerType::NAME_SERVER

物件導向-C客戶端SDKs

  • 將”ns.photonengine.cn”作為參數serverAdress傳給EGLoadBalancingClient::connect()
  • 確保將參數serverType保持在默認值EGServerType_NAME_SERVER
Back to top