如何在Realtime中選擇中國區域
關于地區
Photon Cloud為您提供全球連接,以便在全球范圍內實現低延遲游戲。
客戶端的初始連接轉到Photon Nameserver,它為客戶端提供可用區域列表。 通常,客戶端連接啟用“最佳區域”選擇,這將幫助客戶端檢測具有最低ping的區域并連接到它(見下文)。
每個區域與其他區域完全分開,由主服務器(用于配對)和游戲服務器(用于托管房間)組成。

可用區域的完整列表如下。 在儀表板中,您可以定義哪些區域應該可供客戶端使用。
最佳區域的考慮
“最佳區域”選項不具有確定性。 有時它可能是“隨機的”,因為有時候/某種情況下會得到幾乎沒有變化或完全相同的ping計算。
從理論上講,你可以發現:
- 同一設備對您可選擇的多個區域具有相同的完全ping值。所以您最終連接到同一個網絡的客戶端上設置了不同區域,造成區域選擇會是隨機的。
- 不同的設備連接到同一個區域,有不同的Ping值(或者同一個設備的多次不同嘗試)。
例如,在“us”和“usw”(或“ru”和“rue”)的設置下,您可以使用在線區域白名單來選擇您想要連接或者排除的區域。
可用區域
Photon Cloud在全球多個地區擁有服務器,并分布在世界各地有多個托管中心。
每個光子云區域由“區域令牌”標識。
要通過客戶端的“Connect”方法傳遞”region token”區域令牌,請調用
loadBalancingClient.ConnectToRegionMaster(regionString);
可用區域和令牌清單:
| 區域 | 位置 | 令牌 |
|---|---|---|
| 亞洲 | 新加坡 | ASIA |
| 澳大利亞 | 墨爾本 | AU |
| 加拿大,東部 | 蒙特利爾 | CAE |
| 中國大陸 | 上海 | CN |
| 歐洲 | 阿姆斯特丹 | EU |
| 印度 | 金奈 | IN |
| 日本 | 東京 | JP |
| 俄國 | 莫斯科 | RU |
| 俄羅斯東部 | 哈巴羅夫斯克 | RUE |
| 南美洲 | 圣保羅 | SA |
| 韓國 | 漢城 | KR |
| 美國,東部 | 華盛頓 | US |
| 美國,西部 | 圣荷西 | USW |
控制面板區域過濾
您可以直接從您賬戶的控制面板(儀表盤)過濾每個應用程序可用的Photon Cloud區域列表。

轉到儀表板,然后單擊所選應用程序的“管理”,然后單擊“編輯”。 您將找到一個輸入字段,您可以在其中輸入列入白名單的區域,如下所示:
- 允許的列表應該是用分號分隔的區域標記字符串。 例如“eu; us”。
- 區域令牌不區分大小寫,并在此定義。
- 未定義或無法識別的區域令牌將從列表中忽略。
- 空(“”)或格式不正確的字符串(例如“;;”)表示空列表。
- 空列表表示允許所有可用區域。
確認并保存后, GetRegions操作將只返回過濾的區域列表。 因此,客戶端應該從該列表中選擇任何可用的區域,但請考慮到儀表盤的更新可能需要10分鐘左右的時間(根據網絡情況而定)。
如何選擇一個地區
如果連接到Photon Cloud CN地區,國內區域用戶的延遲最低,非常簡單的邏輯。
但是如果你有來自世界各地的用戶呢?
您可以
- a)讓游戲客戶端ping不同的Photon Cloud區域,并預先選擇最好的ping,閱讀我們在文章下方提供的操作方法
- b)使用固定了區域的客戶端版本,因此來自不同地區的用戶連接到不同的Photon Cloud區域
- c)讓用戶從游戲菜單中選擇一個匹配區域。
或者,您可以d)讓所有用戶連接到相同的地區,如果您的游戲玩家可以接受更高的延遲時間,例如任何“不那么實時”的游戲。
所有Photon Cloud應用程序都可在所有可用區域工作,無需任何額外費用。?查看價格。
Photon Cloud的儀表板可讓您監控每個地區的游戲使用情況,輕松升級或降級您的訂閱計劃。?轉到您的儀表盤。
如何以最低延遲開始游戲

連接到最近的主服務器
光子不建議使用通用的區域主服務器地址與主服務器的直接連接方法。?而是使用SDK提供的方法連接到您正在使用的區域主機!
如果您知道您的客戶端連接到的最接近的區域,則可以只連接到該區域。
loadBalancingClient.ConnectToRegionMaster("us");
對于其他平臺,請從SDK列表中鏈接到相應的SDK和API?。
SDK將從名稱服務器(NameServer)獲取所請求區域的主服務器地址(上圖“連接到Photon Cloud地區”中的數字1),然后自動將您連接到所選區域中的主服務器(上圖“連接到Photon Cloud地區”中的數字2)。
如何在運行時選擇一個區域
如果要在運行時選擇區域 – 例如,通過向玩家顯示可用區域列表并讓其選擇,則需要先連接到名稱服務器。?然后,您可以向名稱服務器查詢當前可用的區域主服務器地址列表(上面代碼范例中的“ConnectToRegionMaster”)。
當我們寫“名稱服務器”時,名稱服務器實際上是在可用區域之間的地理位置負載平衡。?這樣可以盡可能快地請求主服務器的地址。
C#客戶端SDK
loadBalancingClient.ConnectToNameServer()
連接成功后,您可以獲得可用區域的列表。
loadBalancingClient.OpGetRegions()
使用主服務器列表,您現在可以ping所有來可用區域查找最佳連接時間,以達到最低延遲的游戲時間,或者讓玩家選擇一個區域。
當您的客戶端確定該區域時,連接到該區域的主服務器(圖“連接到Photon Cloud地區”中的數字2)。
loadBalancingClient.ConnectToRegionMaster("us")
最后,加入或創建一個游戲的空間(圖“連接到Photon Cloud地區”中的數字3)。
C++客戶端SDK
1.確保您連接到Photon Cloud。 Photon Server不支持云區域。
2.類Client的構造方法有兩個可選參數。 最后一個,稱為regionSelectionMode ,其中一個值來自LoadBalancing::RegionSelectionMode ,默認值為RegionSelectionMode::DEFAULT 。 請明確地傳遞RegionSelectionMode::SELECT?的參數。
3.在通過調用Client::connect()觸發的連接流程中,客戶端從名稱服務器接收可用區域的列表。 Listener聲明一個可選的回調Listener::onAvailableRegions() 。 如果您已經為regionSelectionModei傳遞了RegionSelectionMode::SELECT ,那么Client將不會自動選擇該可用區域列表中的一個項目,而是將列表傳遞給該回調。 因此在您的Listener實現中,您應該使用有意義的實現來覆蓋該回調的空默認實現,根據您可以提出的任何條件選擇一個區域。
4.連接流程完全停止,直到選擇了一個區域。
5.將所選區域傳遞給Client::selectRegion()以繼續連接流程。
注意:只有在收到對Listener::onAvailableRegions()調用之后, selectRegion()調用selectRegion()Listener::onAvailableRegions() (直接從此回調期間或之后的回調selectRegion()返回后直接調用selectRegion() )。 否則,客戶端不會處于連接流程的正確階段,進行區域選擇。
Listener::onAvailableRegions()的示例實現可以在Client SDK中的demo_loadBalancing的源代碼中找到:
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]);
}
請注意,在接收到onAvailableRegions()的調用后, selectRegion()僅在連接流期間被調用。 在任何其他時間或狀態下調用它,或者多次調用它來單次調用onAvailableRegions()并且不產生未定義的行為。
Objective-C客戶端SDK
1.確保您連接到Photon Cloud。 Photon Server不支持云區域。
2. EGLoadBalancingClient類的EGLoadBalancingClient有兩個可選參數。 最后一個,稱為regionSelectionMode ,其中一個值來自EGRegionSelectionMode.h ,默認為EGRegionSelectionMode_DEFAULT 。 請明確地傳遞該參數的EGRegionSelectionMode_SELECT 。
3.在您通過調用EGLoadBalancingClient::connect()觸發的連接流程中,客戶端從名稱服務器接收可用區域的列表。EGLoadBalancingListener聲明一個可選的回調EGLoadBalancingListener::onAvailableRegions() 。 如果您已經通過了EGRegionSelectionMode_SELECT的regionSelectionMode ,那么EGLoadBalancingClient將不會自動選擇該可用區域列表中的一個項目,而是將列表傳遞給該回調。 因此在您的EGLoadBalancingListener實現中,您應該使用有意義的實現來覆蓋該回調的空默認實現,根據您可以提出的任何條件選擇一個區域。
4.連接流程完全停止,直到選擇了一個區域。
5.將所選區域傳遞給EGLoadBalancingClient::selectRegion()以繼續連接流。
注意: EGLoadBalancingClient::selectRegion()只有在您收到EGLoadBalancingListener::onAvailableRegions() (直接從此回調之后調用selectRegion()之后(在回調已返回)之后selectRegion()調用。 否則,客戶端不會處于連接流程的正確階段,供區域選擇。
EGLoadBalancingListener::onAvailableRegions()的示例實現可以在Client SDK中的demo_loadBalancing_objc的源代碼中找到:
- (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]];
}
請注意,在接收到onAvailableRegions()的調用后, selectRegion()僅在連接流期間被調用。 在任何其他時間或狀態下調用它,或者多次調用它來單次調用onAvailableRegions()并且不產生未定義的行為。
使用中國大陸地區
光子名稱服務器必須在中國本地,否則訪問延遲可能會非常高。?中國光子的名稱服務地址是“ns.photonengine.cn”。
與中國大陸以外的客戶聯系很可能不會取得好成績。 此外,從Photon服務器連接到中國大陸以外的服務器(例如,用于自定義認證,WebHooks,WebRPC)可能不可靠。
重要提示 :在當前階段,您通過信息中心對您的應用進行的更改不會自動反映在中國的應用高速緩存中。 如果您有更新請求,請通過電子郵件通知我們。
同樣出于法律原因,您需要為中國獨立構建獨立的Appid,所以我們建議您使用單獨的AppId。 例如,使用編譯條件(您選擇的)根據構建來更改AppId和Photon NameServer。
請注意,如果您連接中國區,請按照以下說明為中國區做出專門設置:
C#客戶端SDK
1.將AppId設置為中國區域解鎖的應用程序。 如果你想使用相同的項目并且有不同的構建,你可以這樣做:
// TODO: replace compile condition with your own
#if CHINA
loadBalancingClient.AppID = "ChinaRealtimeAppId"; // TODO: replace with your own AppId
#else
loadBalancingClient.AppID = "nonChinaRealtimeAppId"; // TODO: replace with your own AppId
#endif
2.打開“LoadBalancingClient.cs”文件,并將NameServerHost設置為“ns.photonengine.cn”:
// TODO: replace compile condition with your own
#if CHINA
public const string NameServerHost = "ns.photonengine.cn";
#else
public const string NameServerHost = "ns.exitgames.com";
#endif
3.使用LoadBalancingClient.ConnectToRegionMaster(“CN”)連接中國大陸地區。
// TODO: replace compile condition with your own
#if CHINA
loadBalancingClient.ConnectToRegionMaster("cn");
#else
// TODO: connect to any other region
#endif
C ++客戶端SDK
- 將參數serverAdress “ns.photonengine.cn”傳遞給Client::connect() 。
- 請確保將參數serverType保留在其默認值ServerType::NAME_SERVER 。
Objective-C客戶端SDK
- 將參數serverAdress “ns.photonengine.cn”傳遞給EGLoadBalancingClient::connect()
- 請確保將參數serverType保持在默認值EGServerType_NAME_SERVER 。