关于地区
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 。