<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PhotonCloud | 光子引擎photonengine中文站</title>
	<atom:link href="https://vibrantlink.com/category/photoncloud/feed/" rel="self" type="application/rss+xml" />
	<link>https://vibrantlink.com</link>
	<description>成都动联无限科技有限公司</description>
	<lastBuildDate>Sun, 05 Oct 2025 07:18:22 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://vibrantlink.com/wp-content/uploads/2017/03/cropped-VL-text-dong-32x32.png</url>
	<title>PhotonCloud | 光子引擎photonengine中文站</title>
	<link>https://vibrantlink.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">125330554</site>	<item>
		<title>PUN Tutorial 多人在线游戏教程译文</title>
		<link>https://vibrantlink.com/pun_multiplay_manual/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Fri, 19 May 2017 04:40:12 +0000</pubDate>
				<category><![CDATA[PhotonCloud]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://vibrantlink.com/?p=328</guid>

					<description><![CDATA[<p>来自Photon开发者胡良云的翻译文档，获得其授权进行转载和下载。</p>
The post <a href="https://vibrantlink.com/pun_multiplay_manual/">PUN Tutorial 多人在线游戏教程译文</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></description>
										<content:encoded><![CDATA[<a href="https://vibrantlink.com/wp-content/uploads/2017/05/PUN-Tutorial-多人在线游戏教程译文.pdf" class="pdfemb-viewer" style="" data-width="max" data-height="max" data-mobile-width="500"  data-scrollbar="none" data-download="on" data-tracking="on" data-newwindow="on" data-pagetextbox="off" data-scrolltotop="on" data-startzoom="100" data-startfpzoom="100" data-toolbar="bottom" data-toolbar-fixed="off">PUN Tutorial 多人在线游戏教程译文<br/></a>
<p><em>来自Photon开发者<span style="color: #ff9900;">胡良云</span>的翻译文档，获得其授权进行转载和下载。</em></p>The post <a href="https://vibrantlink.com/pun_multiplay_manual/">PUN Tutorial 多人在线游戏教程译文</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">328</post-id>	</item>
		<item>
		<title>如何在Realtime中选择中国区域</title>
		<link>https://vibrantlink.com/chinacloudrealtime/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Thu, 23 Mar 2017 15:21:22 +0000</pubDate>
				<category><![CDATA[5min]]></category>
		<category><![CDATA[PhotonCloud]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://vibrantlink.com/?p=299</guid>

					<description><![CDATA[<p>关于地区 Photon Cloud为您提供全球连接，以便在全球范围内实现低延迟游戏。 客户端的初始连接转到Ph [&#8230;]</p>
The post <a href="https://vibrantlink.com/chinacloudrealtime/">如何在Realtime中选择中国区域</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></description>
										<content:encoded><![CDATA[<h3>关于地区</h3>
<p>Photon Cloud为您提供全球连接，以便在全球范围内实现低延迟游戏。</p>
<p>客户端的初始连接转到Photon Nameserver，它为客户端提供可用区域列表。 通常，客户端连接启用“最佳区域”选择，这将帮助客户端检测具有最低ping的区域并连接到它（见下文）。</p>
<p>每个区域与其他区域完全分开，由主服务器（用于配对）和游戏服务器（用于托管房间）组成。</p>
<figure id="attachment_301" aria-describedby="caption-attachment-301" style="width: 660px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" class="wp-image-301 size-full" src="https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server.png" alt="" width="660" height="289" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server.png 660w, https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server-300x131.png 300w" sizes="(max-width: 660px) 100vw, 660px" /><figcaption id="caption-attachment-301" class="wp-caption-text">连接到光子云区域</figcaption></figure>
<p>可用区域的完整列表如下。 在仪表板中，您可以定义哪些区域应该可供客户端使用。</p>
<h3>最佳区域的考虑</h3>
<p>“最佳区域”选项不具有确定性。 有时它可能是“随机的”，因为有时候/某种情况下会得到几乎没有变化或完全相同的ping计算。</p>
<p>从理论上讲，你可以发现：</p>
<ul>
<li>同一设备对您可选择的多个区域具有相同的完全ping值。所以您最终连接到同一个网络的客户端上设置了不同区域，造成区域选择会是随机的。</li>
<li>不同的设备连接到同一个区域，有不同的Ping值（或者同一个设备的多次不同尝试)。</li>
</ul>
<p>例如，在“us”和“usw”（或“ru”和“rue”）的设置下，您可以使用在线区域白名单来选择您想要连接或者排除的区域。</p>
<h3>可用区域</h3>
<p>Photon Cloud在全球多个地区拥有服务器，并分布在世界各地有多个托管中心。</p>
<p>每个光子云区域由“区域令牌”标识。</p>
<p>要通过客户端的“Connect”方法传递&#8221;region token&#8221;区域令牌，请调用</p>
<pre class="EnlighterJSRAW" data-enlighter-theme="twilight">loadBalancingClient.ConnectToRegionMaster(regionString);</pre>
<p>可用区域和令牌清单：</p>
<table class="table">
<thead>
<tr>
<th><span class="notranslate">区域</span></th>
<th><span class="notranslate">位置</span></th>
<th>令牌</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="notranslate">亚洲</span></td>
<td><span class="notranslate">新加坡</span></td>
<td><span class="notranslate">ASIA</span></td>
</tr>
<tr>
<td><span class="notranslate">澳大利亚</span></td>
<td><span class="notranslate">墨尔本</span></td>
<td><span class="notranslate">AU</span></td>
</tr>
<tr>
<td><span class="notranslate">加拿大，东部</span></td>
<td><span class="notranslate">蒙特利尔</span></td>
<td><span class="notranslate">CAE</span></td>
</tr>
<tr>
<td><span class="notranslate">中国大陆</span></td>
<td><span class="notranslate">上海</span></td>
<td><span class="notranslate">CN</span></td>
</tr>
<tr>
<td><span class="notranslate">欧洲</span></td>
<td><span class="notranslate">阿姆斯特丹</span></td>
<td>EU</td>
</tr>
<tr>
<td><span class="notranslate">印度</span></td>
<td><span class="notranslate">金奈</span></td>
<td><span class="notranslate">IN</span></td>
</tr>
<tr>
<td><span class="notranslate">日本</span></td>
<td><span class="notranslate">东京</span></td>
<td><span class="notranslate">JP</span></td>
</tr>
<tr>
<td><span class="notranslate">俄国</span></td>
<td><span class="notranslate">莫斯科</span></td>
<td><span class="notranslate">RU</span></td>
</tr>
<tr>
<td><span class="notranslate">俄罗斯东部</span></td>
<td><span class="notranslate">哈巴罗夫斯克</span></td>
<td><span class="notranslate">RUE</span></td>
</tr>
<tr>
<td><span class="notranslate">南美洲</span></td>
<td><span class="notranslate">圣保罗</span></td>
<td><span class="notranslate">SA</span></td>
</tr>
<tr>
<td><span class="notranslate">韩国</span></td>
<td><span class="notranslate">汉城</span></td>
<td><span class="notranslate">KR</span></td>
</tr>
<tr>
<td><span class="notranslate">美国，东部</span></td>
<td><span class="notranslate">华盛顿</span></td>
<td><span class="notranslate">US</span></td>
</tr>
<tr>
<td><span class="notranslate">美国，西部</span></td>
<td><span class="notranslate">圣荷西</span></td>
<td><span class="notranslate">USW</span></td>
</tr>
</tbody>
</table>
<h3></h3>
<h3></h3>
<h3><span class="notranslate">控制面板区域过滤</span></h3>
<p><span class="notranslate">您可以直接从您账户的控制面板（仪表盘）过滤每个应用程序可用的Photon Cloud区域列表。</span></p>
<figure id="attachment_341" aria-describedby="caption-attachment-341" style="width: 724px" class="wp-caption aligncenter"><a href="http://vibrantlink.com/chinacloudrealtime/regions_dashboard_filtering/" rel="attachment wp-att-341"><img decoding="async" class="wp-image-341 size-full" src="http://vibrantlink.com/wp-content/uploads/2017/03/regions_dashboard_filtering.png" alt="光子云区域设定截图" width="724" height="459" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/regions_dashboard_filtering.png 724w, https://vibrantlink.com/wp-content/uploads/2017/03/regions_dashboard_filtering-300x190.png 300w" sizes="(max-width: 724px) 100vw, 724px" /></a><figcaption id="caption-attachment-341" class="wp-caption-text">设定可用的光子云区域</figcaption></figure>
<p><span class="notranslate">转到仪表板，然后单击所选应用程序的“管理”，然后单击“编辑”。</span> <span class="notranslate">您将找到一个输入字段，您可以在其中输入列入白名单的区域，如下所示：</span></p>
<ul>
<li><span class="notranslate">允许的列表应该是用分号分隔的区域标记字符串。</span> <span class="notranslate">例如“eu; us”。</span></li>
<li><span class="notranslate">区域令牌不区分大小写，并在此定义。</span></li>
<li><span class="notranslate">未定义或无法识别的区域令牌将从列表中忽略。</span></li>
<li><span class="notranslate">空（“”）或格式不正确的字符串（例如“;;”）表示空列表。</span></li>
<li><span class="notranslate">空列表表示允许所有可用区域。</span></li>
</ul>
<p><span class="notranslate">确认并保存后， <span style="color: #ff6600;">GetRegions</span>操作将只返回过滤的区域列表。</span> <span class="notranslate">因此，客户端应该从该列表中选择任何可用的区域，但请考虑到</span><span class="notranslate">仪表盘的更新可能需要10分钟左右的时间（根据网络情况而定）。</span></p>
<h3>如何选择一个地区</h3>
<p><span class="notranslate">如果连接到Photon Cloud CN地区，国内区域用户的延迟最低，非常</span><span class="notranslate">简单的逻辑。</span></p>
<p><i id="geoloadbalancing"></i><span class="notranslate">但是如果你有来自世界各地的用户呢？</span></p>
<p><span class="notranslate">您可以</span></p>
<ul>
<li><span class="notranslate">a）让游戏客户端ping不同的Photon Cloud区域，并预先选择最好的ping，阅读我们在文章下方提供的操作方法</span></li>
<li><span class="notranslate">b）使用固定了区域的客户端版本，因此来自不同地区的用户连接到不同的Photon Cloud区域</span></li>
<li><span class="notranslate">c）让用户从游戏菜单中选择一个匹配区域。</span></li>
</ul>
<p><span class="notranslate">或者，您可以d）让所有用户连接到相同的地区，如果您的游戏玩家可以接受更高的延迟时间，例如任何“不那么实时”的游戏。</span></p>
<p><span class="notranslate">所有Photon Cloud应用程序都可在所有可用区域工作，无需任何额外费用。</span> 查看<span class="notranslate"><a href="http://vibrantlink.com/photoncloud/" target="_blank" rel="noopener">价格</a>。</span></p>
<p><span class="notranslate">Photon Cloud的仪表板可让您监控每个地区的游戏使用情况，轻松升级或降级您的订阅计划。</span> <span class="notranslate"><a href="https://www.photonengine.com/en-us/dashboard/realtime" target="_blank" rel="noopener">转到您的仪表盘</a>。</span></p>
<h3></h3>
<h3><span class="notranslate">如何以最低延迟开始游戏</span></h3>
<p><img decoding="async" class="wp-image-301 size-full aligncenter" style="font-size: 16px;" src="https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server.png" alt="" width="660" height="289" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server.png 660w, https://vibrantlink.com/wp-content/uploads/2017/03/photon-cloud-connect-name-server-300x131.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h3><span class="notranslate">连接到最近的主服务器</span></h3>
<blockquote>
<p class="alert alert-warning"><span class="notranslate">光子不建议使用通用的区域主服务器地址与主服务器的直接连接方法。</span> <span class="notranslate">而是使用SDK提供的方法连接到您正在使用的区域主机！</span></p>
</blockquote>
<p><span class="notranslate">如果您知道您的客户端连接到的最接近的区域，则可以只连接到该区域。</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">loadBalancingClient.ConnectToRegionMaster("us");</pre>
<p><span class="notranslate"><em>对于其他平台，请从SDK列表中链接到相应的SDK和API 。</em></span></p>
<p><span class="notranslate">SDK将从名称服务器（NameServer)获取所请求区域的主服务器地址（上图“连接到Photon Cloud地区”中的数字1），然后自动将您连接到所选区域中的主服务器（上图“连接到Photon Cloud地区”中的数字2）。</span></p>
<h3><span class="notranslate">如何在运行时选择一个区域</span></h3>
<p><span class="notranslate">如果要在运行时选择区域 &#8211; 例如，通过向玩家显示可用区域列表并让其选择，则需要先连接到名称服务器。</span> <span class="notranslate">然后，您可以向名称服务器查询当前可用的区域主服务器地址列表（上面代码范例中的“ConnectToRegionMaster”）。</span></p>
<blockquote><p><span class="notranslate">当我们写“名称服务器”时，名称服务器实际上是在可用区域之间的地理位置负载平衡。</span> <span class="notranslate">这样可以尽可能快地请求主服务器的地址。</span></p></blockquote>
<h3>C#客户端SDK</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">loadBalancingClient.ConnectToNameServer()</pre>
<p>连接成功后，您可以获得可用区域的列表。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">loadBalancingClient.OpGetRegions()</pre>
<p><span class="notranslate">使用主服务器列表，您现在可以ping所有来可用区域查找最佳连接时间，以达到最低延迟的游戏时间，或者让玩家选择一个区域。</span></p>
<p><span class="notranslate">当您的客户端确定该区域时，连接到该区域的主服务器（图“连接到Photon Cloud地区”中的数字2）。</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">loadBalancingClient.ConnectToRegionMaster("us")</pre>
<p>最后，加入或创建一个游戏的空间（图“连接到Photon Cloud地区”中的数字3）。</p>
<h3></h3>
<h3>C++客户端SDK</h3>
<p><span class="notranslate">1.确保您连接到Photon Cloud。</span> <span class="notranslate"><strong>Photon Server不支持云区域</strong>。</span></p>
<p><span class="notranslate">2.类</span><span style="color: #ff6600;">Client</span><span class="notranslate">的构造方法有两个可选参数。</span> <span class="notranslate">最后一个，称为</span><span style="color: #ff6600;">regionSelectionMode</span><span class="notranslate"> ，其中一个值来自</span><span style="color: #ff6600;">LoadBalancing::RegionSelectionMode</span><span class="notranslate"> ，默认值为</span><span style="color: #ff6600;">RegionSelectionMode::DEFAULT</span><span class="notranslate"> 。</span> <span class="notranslate">请明确地传递</span><span style="color: #ff6600;">RegionSelectionMode::SELECT</span><span class="notranslate"> 的参数。</span></p>
<p><span class="notranslate">3.在通过调用</span><span style="color: #ff6600;">Client::connect()</span><span class="notranslate">触发的连接流程中，客户端从名称服务器接收可用区域的列表。</span> <span style="color: #ff6600;">Listener</span><span class="notranslate">声明一个可选的回调</span><span style="color: #ff6600;">Listener::onAvailableRegions()</span><span class="notranslate"> 。</span> <span class="notranslate">如果您已经为</span><span style="color: #ff6600;">regionSelectionModei</span><span class="notranslate">传递了</span><span style="color: #ff6600;">RegionSelectionMode::SELECT </span><span class="notranslate">，那么</span><span style="color: #ff6600;">Client</span><span class="notranslate">将不会自动选择该可用区域列表中的一个项目，而是将列表传递给该回调。</span> <span class="notranslate">因此在您的</span><span style="color: #ff6600;">Listener</span><span class="notranslate">实现中，您应该使用有意义的实现来覆盖该回调的空默认实现，根据您可以提出的任何条件选择一个区域。</span></p>
<p><span class="notranslate">4.连接流程完全停止，直到选择了一个区域。</span></p>
<p><span class="notranslate">5.将所选区域传递给</span><span style="color: #ff6600;">Client::selectRegion()</span><span class="notranslate">以继续连接流程。</span></p>
<p><span class="notranslate">注意：只有在收到对</span><span style="color: #ff6600;">Listener::onAvailableRegions()</span><span class="notranslate">调用之后， </span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">调用</span><span style="color: #ff6600;">selectRegion()Listener::onAvailableRegions() </span><span class="notranslate">（直接从此回调期间或之后的回调</span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">返回后直接调用</span><span style="color: #ff6600;">selectRegion() </span><span class="notranslate">）。</span> <span class="notranslate">否则，客户端不会处于连接流程的正确阶段，进行区域选择。</span></p>
<p><span style="color: #ff6600;">Listener::onAvailableRegions()</span><span class="notranslate">的示例实现可以在Client SDK中的demo_loadBalancing的源代码中找到：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="twilight">void NetworkLogic::onAvailableRegions(const ExitGames::Common::JVector&lt;ExitGames::Common::JString&gt;&amp; availableRegions, const ExitGames::Common::JVector&lt;ExitGames::Common::JString&gt;&amp; availableRegionServers)
{
    EGLOG(ExitGames::Common::DebugLevel::INFO, L"%ls / %ls", availableRegions.toString().cstr(), availableRegionServers.toString().cstr());
    mpOutputListener-&gt;writeLine(L"onAvailableRegions: " + availableRegions.toString() + L" / " + availableRegionServers.toString());
    // select first region from list
    mpOutputListener-&gt;writeLine(L"selecting region: " + availableRegions[0]);
    mLoadBalancingClient.selectRegion(availableRegions[0]);
}</pre>
<p><span class="notranslate">请注意，在接收到</span><span style="color: #ff6600;">onAvailableRegions()</span><span class="notranslate">的调用后， </span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">仅在连接流期间被调用。</span> <span class="notranslate">在任何其他时间或状态下调用它，或者多次调用它来单次调用</span><span style="color: #ff6600;">onAvailableRegions()</span><span class="notranslate">并且不产生未定义的行为。</span></p>
<h3>Objective-C客户端SDK</h3>
<p><span class="notranslate">1.确保您连接到Photon Cloud。</span> <span class="notranslate"><strong>Photon Server不支持云区域</strong>。</span></p>
<p><span class="notranslate">2. </span><span style="color: #ff6600;">EGLoadBalancingClient<span style="color: #000000;">类的</span>EGLoadBalancingClient</span><span class="notranslate">有两个可选参数。</span> <span class="notranslate">最后一个，称为</span><span style="color: #ff6600;">regionSelectionMode</span><span class="notranslate"> ，其中一个值来自</span><span style="color: #ff6600;">EGRegionSelectionMode.h</span><span class="notranslate"> ，默认为</span><span style="color: #ff6600;">EGRegionSelectionMode_DEFAULT</span><span class="notranslate"> 。</span> <span class="notranslate">请明确地传递该参数的</span><span style="color: #ff6600;">EGRegionSelectionMode_SELECT</span><span class="notranslate"> 。</span></p>
<p><span class="notranslate">3.在您通过调用</span><span style="color: #ff6600;">EGLoadBalancingClient::connect()</span><span class="notranslate">触发的连接流程中，客户端从名称服务器接收可用区域的列表。</span><span style="color: #ff6600;">EGLoadBalancingListener</span><span class="notranslate">声明一个可选的回调</span><span style="color: #ff6600;">EGLoadBalancingListener::onAvailableRegions() </span><span class="notranslate">。</span> <span class="notranslate">如果您已经通过了</span><span style="color: #ff6600;">EGRegionSelectionMode_SELECT<span style="color: #000000;">的</span>regionSelectionMode</span><span class="notranslate"> ，那么</span><span style="color: #ff6600;">EGLoadBalancingClient</span><span class="notranslate">将不会自动选择该可用区域列表中的一个项目，而是将列表传递给该回调。</span> <span class="notranslate">因此在您的</span><span style="color: #ff6600;">EGLoadBalancingListener</span><span class="notranslate">实现中，您应该使用有意义的实现来覆盖该回调的空默认实现，根据您可以提出的任何条件选择一个区域。</span></p>
<p><span class="notranslate">4.连接流程完全停止，直到选择了一个区域。</span></p>
<p><span class="notranslate">5.将所选区域传递给</span><span style="color: #ff6600;">EGLoadBalancingClient::selectRegion()</span><span class="notranslate">以继续连接流。</span></p>
<p><span class="notranslate">注意： </span><span style="color: #ff6600;">EGLoadBalancingClient::selectRegion()</span><span class="notranslate">只有在您收到</span><span style="color: #ff6600;">EGLoadBalancingListener::onAvailableRegions() </span><span class="notranslate">（直接从此回调之后调用</span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">之后（在回调已返回）之后</span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">调用。</span> <span class="notranslate">否则，客户端不会处于连接流程的正确阶段，供区域选择。</span></p>
<p><span class="notranslate"><code></code></span><span style="color: #ff6600;">EGLoadBalancingListener::onAvailableRegions()</span><span class="notranslate">的示例实现可以在Client SDK中的demo_loadBalancing_objc的源代码中找到：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="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]];
}</pre>
<p><span class="notranslate">请注意，在接收到</span><span style="color: #ff6600;">onAvailableRegions()</span><span class="notranslate">的调用后， </span><span style="color: #ff6600;">selectRegion()</span><span class="notranslate">仅在连接流期间被调用。</span> <span class="notranslate">在任何其他时间或状态下调用它，或者多次调用它来单次调用</span><span style="color: #ff6600;">onAvailableRegions()</span><span class="notranslate">并且不产生未定义的行为。</span></p>
<h3></h3>
<h3><span class="notranslate">使用中国大陆地区</span></h3>
<div class="alert alert-info"><span class="notranslate">首先，您需要请求访问中国大陆地区的Photon应用程序。</span> <span class="notranslate"><a href="http://vibrantlink.com/contact/" target="_blank" rel="noopener">向我们发送表单，以便我们可以为您的AppID解锁。</a></span></div>
<p><span class="notranslate">光子名称服务器必须在中国本地，否则访问延迟可能会非常高。</span> <span class="notranslate">中国光子的名称服务地址是“ns.photonengine.cn”。</span></p>
<p><span class="notranslate">与中国大陆以外的客户联系很可能不会取得好成绩。</span> <span class="notranslate">此外，从Photon服务器连接到中国大陆以外的服务器（例如，用于自定义认证，WebHooks，WebRPC）可能不可靠。</span></p>
<blockquote><p><span class="notranslate"><b>重要提示</b> ：在当前阶段，您通过信息中心对您的应用进行的更改不会自动反映在中国的应用高速缓存中。</span> <span class="notranslate">如果您有更新请求，请通过电子邮件通知我们。</span></p></blockquote>
<p><span class="notranslate">同样出于法律原因，您需要为中国独立构建独立的Appid，所以我们建议您使用单独的AppId。</span> <span class="notranslate">例如，使用编译条件（您选择的）根据构建来更改AppId和Photon NameServer。</span></p>
<p><span class="notranslate">请注意，如果您连接中国区，请按照以下说明为中国区做出专门设置：</span></p>
<h3>C#客户端SDK</h3>
<p>1.<span class="notranslate">将AppId设置为中国区域解锁的应用程序。</span> <span class="notranslate">如果你想使用相同的项目并且有不同的构建，你可以这样做:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">// 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</pre>
<p>2.打开“LoadBalancingClient.cs”文件，并将<span style="color: #ff6600;">NameServerHost</span>设置为“<span class="notranslate">ns.photonengine.cn</span>”：</p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">// TODO: replace compile condition with your own
#if CHINA
    public const string NameServerHost = "<span class="notranslate">ns.photonengine.cn</span>";
#else
    public const string NameServerHost = "ns.exitgames.com";
#endif</pre>
<p>3.使用<span style="color: #ff6600;">LoadBalancingClient.ConnectToRegionMaster(&#8220;CN&#8221;)</span>连接中国大陆地区。</p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">// TODO: replace compile condition with your own
#if CHINA
    loadBalancingClient.ConnectToRegionMaster("cn");
#else
    // TODO: connect to any other region
#endif</pre>
<p>C ++客户端SDK</p>
<ul>
<li><span class="notranslate">将参数</span><span style="color: #ff6600;">serverAdress</span><span class="notranslate"> “ns.photonengine.cn”传递给</span><span style="color: #ff6600;">Client::connect()</span><span class="notranslate"> 。</span></li>
<li><span class="notranslate">请确保将参数</span><span style="color: #ff6600;">serverType</span><span class="notranslate">保留在其默认值</span><span style="color: #ff6600;">ServerType::NAME_SERVER </span><span class="notranslate">。</span></li>
</ul>
<p>Objective-C客户端SDK</p>
<ul>
<li><span class="notranslate">将参数</span><span style="color: #ff6600;">serverAdress</span><span class="notranslate"> “ns.photonengine.cn”传递给</span><span style="color: #ff6600;">EGLoadBalancingClient::connect()</span></li>
<li><span class="notranslate">请确保将参数</span><span style="color: #ff6600;">serverType</span><span class="notranslate">保持在默认值</span><span style="color: #ff6600;">EGServerType_NAME_SERVER </span><span class="notranslate">。</span></li>
</ul>The post <a href="https://vibrantlink.com/chinacloudrealtime/">如何在Realtime中选择中国区域</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">299</post-id>	</item>
		<item>
		<title>5分钟部署PhotonCloud</title>
		<link>https://vibrantlink.com/5minsphotoncloud/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Fri, 17 Mar 2017 02:44:03 +0000</pubDate>
				<category><![CDATA[5min]]></category>
		<category><![CDATA[PhotonCloud]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://vibrantlink.com/?p=264</guid>

					<description><![CDATA[<p>关于PhotonCloud光子云的区域问题 在您默认开始使用PhotonCloud光子云的时候，区域会被默认为 [&#8230;]</p>
The post <a href="https://vibrantlink.com/5minsphotoncloud/">5分钟部署PhotonCloud</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></description>
										<content:encoded><![CDATA[<h4>关于PhotonCloud光子云的区域问题</h4>
<p><em>在您默认开始使用PhotonCloud光子云的时候，区域会被默认为海外区域，这可能会<span style="color: #ff0000;">严重影响您游戏的连接速度和网络品质</span>。在您通过<a href="http://vibrantlink.com/contact/">中国区邮件申请</a>发送到您的账号名，联络方式和appid给我们之后，1-2个工作日内，我们将为您<span style="color: #ff0000;"><strong>免费开通</strong></span>中国区的PhotonCloud光子云服务（初始限定为20CCU）。</em></p>
<h3 class="p1"><span class="s1">快速开始</span></h3>
<hr />
<p class="p1"><span class="s1">在这篇文章中，您将掌握迅速部署PhotonCloud光子云，并着手于我们的Demo“粒子演示”。</span><span class="s2"> <a href="https://doc.photonengine.com/zh-cn/realtime/current/sdks-and-api/sdks-overview" target="_blank" rel="noopener">我们的SDK</a>附带的演示向您展示了如何在一般的应用环境中如何添加多人功能。 我们将看看基本的Photon操作，并且有什么您马上安装就能使用的便捷功能。</span></p>
<p class="p1"><span class="s2">虽然下面的C＃代码示例是有点专门针对于Photon Unity3D SDK（ <a href="https://www.photonengine.com/realtime/download#unity" target="_blank" rel="noopener">下载</a> ）的，但是下面的基本工作流程（1） 连接 ，（2） 创建房间和（3） 发送事件在各平台的应用之间是通用的。</span></p>
<h3 class="p1"><span class="s1">核心内容</span></h3>
<ul class="ul1">
<li class="li2"><span class="s1">1）连接到主服务器</span></li>
<li class="li2"><span class="s1">2）创建房间/加入房间</span></li>
<li class="li2"><span class="s1">3）发送活动</span></li>
</ul>
<h3 class="p1"><span class="s1">连接到主服务器</span></h3>
<p class="p2"><span class="s2">您需要做的第一件事是将您的客户端连接到云端（光子云）。 我们将此过程称为连接到主服务器。 从那里，主服务器将负责所有客户端到游戏服务器的传输，云中的负载平衡功能负责协调所有可用的房间。</span></p>
<p class="p2"><span class="s2">让我们直接进入我们的演示代码：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight" data-enlighter-title="C#代码范例">// From GameLogic.cs                        
public GameLogic(string masterAddress, string appId, string gameVersion) : base(masterAddress, appId, gameVersion)
{
    this.LocalPlayer.Name = "usr" + SupportClass.ThreadSafeRandom.Next() % 99;
 
    this.AutoJoinLobby = false;
    this.UseInterestGroups = true;
    this.JoinRandomGame = true;
 
    this.DispatchInterval = new TimeKeeper(10);
    this.SendInterval = new TimeKeeper(100);
    this.MoveInterval = new TimeKeeper(500);
    this.UpdateOthersInterval = new TimeKeeper(this.MoveInterval.Interval);
}</pre>
<p class="p1"><em><span class="s1">GameLogic类继承了LoadBalancingClient ，它保持一个状态并自动执行主服务器和游戏服务器之间的转换。 让我们仔细看看GameLogic构造函数中使用的参数：</span></em></p>
<ol class="ol1">
<li class="li1"><b></b><span class="s2"><b>string masterAddress</b> ：要连接的（主）服务器的URL。 请参阅Photon云区域<a href="https://doc.photonengine.com/zh-cn/realtime/current/reference/regions" target="_blank" rel="noopener">列表</a> 。</span></li>
<li class="li1"><b></b><span class="s2"><b>string appId</b> ：在我们的云系统中标识您的应用程序。 如果您还没有AppId，您可以在<a href="https://www.photonengine.com/zh-cn/dashboard/realtime" target="_blank" rel="noopener">Photon Cloud信息中心</a> 创建。 您需要插入有效的AppId才能使大多数演示工作。</span></li>
<li class="li1"><b></b><span class="s2"><b>string gameVersion</b> ：一个字符串，你可以选择曲隔你的游戏的不同版本。 只有具有相同版本号的客户端可以匹配，并且可以相互通信。 这使得添加功能更容易，不会破坏旧客户端。</span></li>
</ol>
<p>&nbsp;</p>
<figure id="attachment_272" aria-describedby="caption-attachment-272" style="width: 600px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-272" src="http://vibrantlink.com/wp-content/uploads/2017/03/Unity3D_Loadingscreen.png" alt="" width="600" height="375" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/Unity3D_Loadingscreen.png 600w, https://vibrantlink.com/wp-content/uploads/2017/03/Unity3D_Loadingscreen-300x188.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-272" class="wp-caption-text">粒子演示截图（Unity3D SDK）</figcaption></figure>
<p class="p1"><span class="s1">连接后，Photon云已准备好遵照你的吩咐。 你不必去做所有细微的调整，因为一切都已经为你处理好了！ 在下面的图表中，您可以看到，灰色方块中的所有内容都是由Photon Cloud组织的。 客户端只需要发送简单的操作，如箭头旁边的那些。</span></p>
<figure id="attachment_273" aria-describedby="caption-attachment-273" style="width: 478px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-273" src="http://vibrantlink.com/wp-content/uploads/2017/03/JoinMSCloud.png" alt="" width="478" height="309" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/JoinMSCloud.png 478w, https://vibrantlink.com/wp-content/uploads/2017/03/JoinMSCloud-300x194.png 300w" sizes="auto, (max-width: 478px) 100vw, 478px" /><figcaption id="caption-attachment-273" class="wp-caption-text">光子云简单的工作流</figcaption></figure>
<p class="p1"><span class="s1">现在我们连接到主服务器，我们可以列出，创建和加入房间。</span><span class="s2"> 在这一点上，玩家<span style="color: #ff0000;">不能相互通信或交互</span>。 这是<span style="color: #ff0000;">房间的概念发挥作用</span>。 仔细想一想，看看你需要做什么来连接玩家彼此。</span></p>
<h3 class="p1"><span class="s1">大厅，创建房间和加入房间</span></h3>
<p class="p2"><span class="s1">默认情况下，当你连接时，LoadBalancing API会让你进入游戏的“Lobby”。 在大厅中，主服务器向客户端提供房间列表。 为了保持例如移动环境中的低流量，客户端不能在大厅中互相交互。</span></p>
<p class="p2"><span class="s1">一个房间可以被认为是一个单独的区域，玩家互动（玩他们的游戏）。 当他们在同一个房间，玩家可以发送和接收来自其他人的事件，更改/更新房间的属性等。</span></p>
<p class="p2"><span class="s1">在下面的示例中，我们使用<span style="text-decoration: underline;"><b>“OpCreateRoom”</b>操作</span>来创建和打开房间。 一起创建一个：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">RoomOptions options = new RoomOptions();
options.options.maxPlayers = 4;
peer.OpCreateRoom("Room 42", options, TypedLobby.Default);</pre>
<p class="p1"><span class="s1">最需要留意的参数和RoomOptions是：</span></p>
<ul class="ul1">
<li class="li1"><b></b><span class="s1"><b>string roomName</b>房间的名称，用于标识和加入房间。</span></li>
<li class="li1"><b></b><span class="s1"><b>bool.RoomOptionsisVisible</b>此变量确定房间是否在可在大厅可见的房间列表中（即连接到主服务器但还没注册但还没有进入房间中的玩家可见）。 重要的是，这些房间仍然可以加入，只要客户端知道房间的确切名称。</span></li>
<li class="li1"><b></b><span class="s1"><b>bool RoomOptions.isOpen</b>确定客户端是否可以加入房间。 当此变量改变时，已经在房间中的客户端不受影响。 然而，他们不能在离开后重新加入房间，只要<b>isOpen</b>是<strong>False</strong>的。</span></li>
<li class="li1"><b></b><span class="s1"><b>byte RoomOptions.maxPlayers</b>决定此房间中的最大玩家数。 如果设置为0，则上限是无限的。 请注意，如果你计划<b>在一个房间里</b>放入大量的用户，你应该看看我们的Photon服务器MMO应用程序！</span></li>
<li class="li1"><b></b><span class="s1"><b>Hashtable RoomOptions.customRoomProperties</b>是一组可选的键和值，您可以定义它们来描述房间。 一个可选的示例是：key“level”，值为“de_dust”。（^_^）。 属性将同步到房间中的所有客户端，并在配对中发挥作用。 更多关于这个选项，见下面。</span></li>
<li class="li1"><b></b><span class="s1"><b>string [] RoomOptions.customRoomPropertiesForLobby</b>将在Lobby中显示的属性。</span></li>
</ul>
<p class="p1"><span class="s1">使用Photon，您可以在运行时更改房间或玩家的属性，因此通过<b>customGameProperties</b>设置<b>属性，</b>在设计服务器逻辑时你将不会有任何限制 。 在房间中使用<b>room.SetCustomProperties（props）</b>设置新值或覆盖现有值。 所做的更改将被合并，因此您只需要传入您想要更改的属性即可。</span></p>
<p class="p1"><span class="s1">一个房间可以有许多属性，但通常只有几个是玩家配对所需要的，所以Photon会希望你在大厅里面定义一个房间的属性关键列表。 即使在<strong>RoomOptions.customRoomProperties</strong>中尚未定义的键也可以在<b>string [] customRoomPropertiesForLobby中</b>使用，并在稍后填充。</span></p>
<figure id="attachment_275" aria-describedby="caption-attachment-275" style="width: 143px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-275" src="http://vibrantlink.com/wp-content/uploads/2017/03/PropertiesCloud1.png" alt="" width="143" height="87" /><figcaption id="caption-attachment-275" class="wp-caption-text">LoadBalancing房间属性示例</figcaption></figure>
<p class="p1"><span class="s1">就像是房间的属性一样，您可以为每个玩家设置自定义属性。</span><span class="s2"> 每个客户端可以设置玩家属性</span><strong><span class="s3">LoadBalancingClient.localPlayer.SetCustomProperties()</span></strong><span class="s2"> ，即使在加入房间之前。 他们一直保留客户端，并与客户端加入或创建的任何房间时保持同步。</span></p>
<figure id="attachment_276" aria-describedby="caption-attachment-276" style="width: 139px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-276" src="http://vibrantlink.com/wp-content/uploads/2017/03/PropertiesCloud.png" alt="" width="139" height="87" /><figcaption id="caption-attachment-276" class="wp-caption-text">LoadBalancing玩家属性示例</figcaption></figure>
<p class="p1"><span class="s1">现在我们成功创建了一个房间，是让其他客户加入的时候了！ 加入房间是非常快速和容易的，不需要任何进一步的解释，看看下面的操作：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">// From LoadBalancingClient.cs                        
public void OnOperationResponse(OperationResponse operationResponse)
{
    ...
    this.OpJoinRoom(name);
}</pre>
<p>&nbsp;</p>
<p><span class="s1">接下来让我们看看玩家现在可以如何互动。</span></p>
<h3 class="p1"><span class="s1">发送事件</span></h3>
<p class="p2"><span class="s1">对于客户端彼此交互，我们使用一个简单的事件系统。 使用事件是向给指定房间内的玩家发送和接收快速可靠信息的主要方式。 所有你游戏逻辑中的重要活动都可以通过这种方式进行传递。您的游戏逻辑的所有必要的数据可以在客户端之间发送。 您甚至可以通过使用简单的参数指定协议（UDP与TCP或可靠的(UDPreliable UDP)与不可靠的UDP(unreliable UDP)）来自定义交换信息的方式，具体取决于您的需要。</span></p>
<figure id="attachment_277" aria-describedby="caption-attachment-277" style="width: 433px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-277" src="http://vibrantlink.com/wp-content/uploads/2017/03/SendEventCloud.png" alt="" width="433" height="151" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/SendEventCloud.png 433w, https://vibrantlink.com/wp-content/uploads/2017/03/SendEventCloud-300x105.png 300w" sizes="auto, (max-width: 433px) 100vw, 433px" /><figcaption id="caption-attachment-277" class="wp-caption-text">LoadBalancing RaiseEvent操作图</figcaption></figure>
<p class="p1"><span class="s1">活动将在房间的参与者之间分发。 您可以决定是否要将活动发送到<span style="text-decoration: underline;">特定的玩家</span>，<span style="text-decoration: underline;">团体</span>或<span style="text-decoration: underline;">个人的列表</span>。</span></p>
<p class="p1"><span class="s1">让我们来看看我们在粒子演示中使用的事件，例如在更改颜色时：</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="twilight">public void ChangeLocalPlayercolor()
{
    if (this.LocalPlayer != null)
    {
        this.LocalPlayer.RandomizeColor();
        this.loadBalancingPeer.OpRaiseEvent(DemoConstants.EvColor, this.LocalPlayer.WriteEvColor(), this.SendReliable, new RaiseEventOptions() { CachingOption = EventCaching.AddToRoomCache });
    }
}</pre>
<p><span class="s1">OpRaiseEvent</span><span class="s2">参数包括：</span></p>
<ul class="ul1">
<li class="li2"><b></b><span class="s3"><b>byte eventCode</b>事件代码指定要提出的实际事件。 有从由255开始向下计算的Photon的预定义事件。而从1开始到199，你可以定义在游戏逻辑中使用自己的事件。</span></li>
<li class="li2"><b></b><span class="s3"><b>Hashtable evData</b>您可以填写此哈希表来传输您需要的所有数据。 这是您将用于在客户端之间交换信息的中央数据结构。 但是，您游戏逻辑的标准的循环和标准化步骤应该作为事件发送（例如回合结束）。</span></li>
<li class="li2"><b></b><span class="s3"><b>bool sendReliable</b>当将此标志设置为“true”时，将从UDP切换到可靠的UDP(reliable UDP)。 这意味着在传输期间丢失的任何包将被重新发送，并且客户端将确保包将按照它们被发送的顺序被解释。 这可能会以负面的方式影响性能，因为这些额外的步骤将增加额外的消息量并增加整体通讯的数据负担。</span></li>
<li class="li2"><b></b><span class="s3"><b>byte RaiseEventOptions.channelId</b>您可以使用不同的通道对发送的事件进行分组和优先级排序。 我们将在一个小例子中说明此功能：假设您使用渠道1发送有关玩家位置的相关信息。 你在你的游戏中启用了可靠的UDP，因为你需要在你的游戏类型获得额外的可靠性。在某些时候，通道1会由于许多消息而拥挤，因为一些玩家有延迟，因为网络连接不好而产生了一定数量的通讯包丢失，因此必须重新发送许多消息。 而这时需要入列发送另一个重要事件（如本轮结束），可能需要一些时间才能确认，因为客户端仍然忙于接收来自通道1的所有位置更新。因此，如果您现在分派一个事件到channelId 0，它将优先于所有其他排队的消息处理。 通过合理的使用此功能，您可以获得设计预期的反应性，并确保游戏逻辑的正确执行，即使在一个平庸的的连接条件下。</span></li>
<li class="li2"><b></b><span class="s3"><b>int [] RaiseEventOptions.targetActors</b>要发送事件的房间中的<b>ActorNumbers的</b>列表。</span></li>
<li class="li2"><b></b><span class="s3"><b>EventCaching RaiseEventOptions.CachingOption</b>影响服务器如何处理事件缓存。 可以缓存玩家稍后加入的事件或删除以前缓存的事件。</span></li>
</ul>
<figure id="attachment_278" aria-describedby="caption-attachment-278" style="width: 600px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-278" src="http://vibrantlink.com/wp-content/uploads/2017/03/ParticleDemo_Game.png" alt="" width="600" height="375" srcset="https://vibrantlink.com/wp-content/uploads/2017/03/ParticleDemo_Game.png 600w, https://vibrantlink.com/wp-content/uploads/2017/03/ParticleDemo_Game-300x188.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-278" class="wp-caption-text">粒子演示（Unity3d SDK）：房间视图截图</figcaption></figure>
<p class="p1"><span class="s1">最后但并非最终的方法，Photon还有额外的重载(Overload)，你可以用来指定接收器组。</span></p>
<h3 class="p1">想进一步了解PhotonCloud光子云？</h3>
<p class="p1">我们推荐您学习Exit Games的官方实例教学马可波罗，您可以在<a href="http://vibrantlink.com/rescource-practices/" target="_blank" rel="noopener">光子实践资源</a>找到被翻译为中文的教程实践连接。</p>
<p class="p1">请留意，如果您有自己的服务器（VPS，阿里云等)，那么PhotonServer光子服务器同样可以担负PhotonCloud光子云的服务器连接功能，请参照<a href="http://vibrantlink.com/5minsphotonserver/" target="_blank" rel="noopener">这篇文章</a>和光子服务器的<a href="http://vibrantlink.com/photonserver/" target="_blank" rel="noopener">详细介绍</a>。</p>The post <a href="https://vibrantlink.com/5minsphotoncloud/">5分钟部署PhotonCloud</a> first appeared on <a href="https://vibrantlink.com">光子引擎photonengine中文站</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">264</post-id>	</item>
	</channel>
</rss>
