Regions
Photon Cloud透過在不同地區託管伺服器,在全球範圍內提供低延遲遊戲。
客戶端從我們的Photon名稱伺服器獲取地區清單。在專案的生命週期中,可能會增加新的地區,也可能會棄用和刪除舊的地區。
每個地區都與其他地區完全分開,由主伺服器(用於對戰配對)和遊戲伺服器(託管房間)組成。
可用地區清單因產品而異(Fusion、Quantum、Chat等)。
使用地區允許清單,您可以定義每個AppId可用哪些地區(見下文)。
以下是本產品的地區清單。
可用地區
Photon Cloud由多個地區的伺服器組成,分佈在世界各地的多個託管中心。
一些地區伺服器只支援特定的產品和客戶端SDK。這意味著,例如,Fusion客戶端可以使用日本地區,但Chat不能。
每個Photon Cloud地區都由一個「地區權杖」標識,該標識是一個不區分大小寫的短字串。
例如,「EU」或「eu」都被接受,並指稱相同的歐洲地區。
地區 | 託管於 | 權杖 |
---|---|---|
亞洲 | 新加坡 | asia |
澳洲 | 雪梨 | au |
加拿大東部 | 蒙特婁 | cae |
中國大陸(參見指引) | 上海 | cn |
歐洲 | 阿姆斯特丹 | eu |
香港 | 香港 | hk |
印度 | 清奈 | in |
日本 | 東京 | jp |
南非 | 約翰尼斯堡 | za |
南美 | 聖保羅 | sa |
韓國 | 首爾 | kr |
土耳其 | 伊斯坦堡 | tr |
阿聯酋 | 杜拜 | uae |
美國東部 | 華盛頓特區 | us |
美國西部 | 聖荷西 | usw |
美國中南部 | 達拉斯 | ussc |
地區允許清單
地區允許清單允許您直接從儀表板自訂每個應用程式的可用地區。使用最佳區域功能的客戶端將自動調整適應。
透過使用更多或更少的地區,您可以平衡服務品質(當有一個靠近玩家的地區時,往返時間會更好)和對戰配對體驗(更少的地區意味著每個地區有更多的玩家)。
要定義每個應用程式的地區,請打開儀表板,針對所選應用程式按一下「管理」,然後按一下「編輯允許清單」。
您將找到一個輸入欄位,用於輸入允許的地區清單,如下所示:
- 上面列出了每個SDK的可用地區,有時也為行業圈單獨列出。
- 允許清單必須是由分號分隔的地區權杖字串。例如"eu;us"。
- 地區權杖不區分大小寫。
- 未定義或無法識別的地區權杖將從清單中忽略。
- 空("")或格式錯誤的字串(例如";;;")表示允許所有可用地區。
在更改(確認並儲存)後10分鐘內,名稱伺服器將向連線的客戶端發送篩選後的清單。
為避免客戶端衝突,請透過ping連線到「最佳地區」,或確保選擇與地區清單一起收到的區域。
如何選擇地區
如果連線到Photon Cloud US地區,則美國用戶的延遲最低。簡單易懂。
但是,如果您有 來自世界各地 的用戶呢?
選項有..
- a) 讓遊戲客戶端ping不同的Photon Cloud區域,並預先選擇ping效果最好的區域,請閱讀我們的方法。
- b) 分發綁定到某個地區的客戶端組建,因此來自不同區域的用戶連線到不同的Photon Cloud地區或
- c) 讓用戶從您的遊戲的UI中選擇一個匹配的地區。
- d) 如果您的遊戲可以接受更高的延遲,請讓所有用戶連線到同一地區。
所有Photon Cloud應用程式都可以在所有可用地區運行,無需任何額外費用。
Photon Cloud的儀表板允許您監控每個地區的遊戲使用情況,並輕鬆升級或降級您的訂閱計畫。
C# Realtime API
Photon Realtime(大多數Photon SDK使用)可以檢測要連線的最佳地區,並讓您可以堅持連線該地區。
為此,客戶端始終在連線時從名稱伺服器獲取可用地區的清單。
伺服器響應用於設定LoadBalancingClient.RegionHandler
,它也透過回調OnRegionListReceived(RegionHandler regionHandler)
提供,如IConnectionCallbacks
中定義。
通常,下一步是調用regionHandler.PingMinimumOfRegions()
以檢測每個地區的當前ping。您需要傳遞一個方法以在完成時調用,在最好的情況下,您還可以傳遞之前運行的「最佳地區摘要」(如下所述)。
在ping伺服器後,(新的)結果將匯總在regionHandler.SummaryToCache
中,它應儲存在裝置上以供以後使用。
如果沒有前一個遊戲階段中的SummaryToCache
,則所有地區都將被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.
連線到特定的主伺服器
要將您的客戶端連線到特定區域,請設定AppSettings.FixedRegion
為一個有效的地區權杖,並調用ConnectUsingSettings(settings)
。
SDK將從名稱伺服器(「連線到Photon Cloud地區」圖中的1)獲取所請求地區的主伺服器地址,並自動將您連接到所選地區中的主伺服器(「連線到Photon Cloud地區」圖中的2)。
使用FixedRegion,客戶端將不會獲取地區清單,也不會跳過ping地區以獲得最佳地區結果。這加快了連接時間。
如果將FixedRegion編譯到組建中,則在不進行更新的情況下無法對其進行更改。在最好的情況下,改為使用最佳地區和地區允許清單。
如何展示一個地區清單
如果您想在運行階段選擇地區,例如透過向玩家顯示可用地區的清單並讓他們選擇,您需要先連接到名稱伺服器。
這將自動獲取當前可用的地區主伺服器地址清單(「連線到Photon Cloud地區」圖中的1)。
當我們寫「名稱伺服器」時,名稱伺服器在可用地區之間是地理負載平衡的。 這使得請求主伺服器地址的時間盡可能短。
C#客戶端SDKs
C#
loadBalancingClient.ConnectToNameServer()
成功連接後,LoadBalancingClient.OpGetRegions()
在內部被調用。此操作的結果將設定loadBalancingClient.RegionHandler
,如果您的程式碼實作OnRegionListReceived
並登錄了回調,則調用它。
有了主伺服器清單,您現在可以ping所有伺服器,以找出連接到最低延遲遊戲的最佳地區,或者讓您的玩家選擇一個地區。這可以透過RegionHandler.PingMinimumOfRegions()
完成。
當您的客戶端確定了一個地區後,連接到該地區的主伺服器(「連線到Photon Cloud地區」圖中的2)。
C#
loadBalancingClient.ConnectToRegionMaster("us")
最後,加入或為您的遊戲創建一個房間(「客戶端連線到Photon Cloud」圖中的3)。
C++客戶端SDKs
Client
類别的構造函數有幾個可選參數。
最後一個名為regionSelectionMode
,從LoadBalancing::RegionSelectionMode
中獲取一個值,預設為RegionSelectionMode::DEFAULT
。
為該參數顯式傳遞RegionSelectionMode::SELECT
。在您調用
Client::connect()
而觸發的連接流中,客戶端從名稱伺服器接收可用地區的清單。
Listener
宣告了一個可選的回調Listener::onAvailableRegions()
。
如果您為regionSelectionMode
傳遞了RegionSelectionMode::SELECT
,那麼Client
不會自動選擇該可用地區清單中的一個項目,而是將該清單傳遞給該回調。
因此,在您的Listener
實作中,您應該用一個有意義的實作來覆蓋該回調的空的預設實作,該實作根據您可以提出的任何標準來選擇一個地區。連接流完全暫停,直到您選擇了一個地區。
將您選擇的地區傳遞給
Client::selectRegion()
以繼續連接流。
注意:
Client::selectRegion()
只會在您收到對Listener::onAvailableRegions()
的調用後被調用(直接從本次回調中調用selectRegion
,或在回調返回後稍後調用)。
否則,客戶端將不會處於連接流的正確階段以進行地區選擇。
可以在客戶端SDK中的demo_loadBalancing的原始程式碼中找到Listener::onAvailableRegions()
的示例實作:
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()
的單個調用中多次調用它,並且這會產生未定義的行為。
Objective-C客戶端SDK
EGLoadBalancingClient
類別的構造函數有幾個可選參數。
最後一個名為regionSelectionMode
,從EGRegionSelectionMode.h
中取一個值,預設為EGRegionSelectionMode_DEFAULT
。
為該參數顯式傳遞EGRegionSelectionMode_SELECT
。在您調用
EGLoadBalancingClient::connect()
而觸發的連接流中,客戶端從名稱伺服器接收可用地區清單。
EGLoadBalancingListener
宣告一個可選的回調EGLoadBalancingListener::onAvailableRegions()
。
如果您為regionSelectionMode
傳遞了EGRegionSelectionMode_SELECT
,則EGLoadBalancingClient
不會自動選擇該可用地區清單中的項目,而是將該清單傳遞給該回調。
因此,在您的EGLoadBalancingListener
實作中,您應該用一個有意義的實作來覆蓋該回調的空的預設實作,該實作根據您能想到的任何標準選擇一個地區。連接流完全暫停,直到您選擇了一個地區。
將您選擇的地區傳遞給
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名稱伺服器必須位於中國本地,否則防火牆可能會封鎖流量。
中國Photon名稱服務器是「ns.photonengine.cn」。
與中國大陸以外的客戶端連線很可能不會產生好的結果。
此外,從Photon伺服器連線到中國大陸以外的服務器(例如用於自訂身份驗證、WebHooks、WebRPC)可能不可靠。
出於法律原因,您需要為中國單獨組建一個版本,我們建議使用單獨的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: replace with your own Realtime AppId unlocked for China region
chinaSettings.AppVersion = "ChinaAppVersion"; // optional
client.ConnectUsingSettings(chinaSettings);
}
C++客戶端SDKs
- 將參數
serverAdress
的「ns.photonengine.cn」傳遞給Client::connect()
。 - 確保參數
serverType
保持其預設值ServerType::NAME_SERVER
。
Objective-C客戶端SDKs
- 將參數
serverAdress
的「ns.photonengine.cn」傳遞給EGLoadBalancingClient::connect()
- 確保將參數
serverType
保持為預設值EGServerType_NAME_SERVER
。