扫码打开虎嗅APP
本文来自微信公众号:机核(ID:gamecores),作者:van灵指引我
近期发售的 Nintendo Switch 游戏《集合啦!动物森友会》作为近期的热门 “社交类” 游戏,联机可以说是十分关键的一个功能。并且官方在游戏设计上也是鼓励玩家相互联机交流,不论是比比谁家的大头菜能卖得贵就去谁家卖,还是谁家有来访的特殊商人,卖地毯还是卖古董,都可以很大程度拓宽玩家可接触到的游戏资源的种类,提升游玩的乐趣。
然而,就在这个联机功能里,也存在着一些看似不理想的设计。
一个问题就是关于玩家进入和离开他人的岛屿时 “隆重” 的欢送仪式。玩家要花费几十秒去存储和等待其他玩家的连接。如果岛主开放了岛后,其他玩家们频繁地进出岛屿,意味着在岛上的玩家们要被频繁地打断,非常影响游戏体验。
更令人沮丧的是,还会发生 “炸岛” 的情况(将在后面详谈),在一些评分网站上玩家们给予本作的打分时的负面评价很多也源自于此。
动森的联机迷思
简单来说,这些情况都是归因于游戏的存档和同步机制。玩家在单人游玩的时候,也就是所谓的单机模式,存档功能就像传统游戏一样:玩家可以手动存档,游戏也会定期自动存档。然而在和其他玩家联机时,也就是多人游戏模式,事情就开始变得复杂了起来。
当前多人游戏的存档模式是,在开放岛屿时和有其他玩家进出岛时,双方玩家都会自动存档。除此之外,游戏不会在中间自动存档。这就意味着,如果在游玩期间有哪个玩家突然掉线(玩家口中常说的炸岛),所有在该岛上的玩家的游戏进度都会重置到上一次存档的时刻。
这无疑是非常令人沮丧的,尤其是在这期间有玩家获得了很大的成就(比如钓到了稀有的鱼)的时候。
那么这些影响游戏体验的设计原因到底是为什么呢?我们先来看看这样一个简单的情景:玩家B通过互联网联机到了玩家A的岛上,然后慷慨地往地上扔了99000铃钱(游戏中的货币单位),这时如果玩家B没有存档并且以非正常方式离开了该岛(比如拔网线),玩家B显然只能恢复到上一个存档:进入玩家A的岛之前的状态,也就是说玩家B的99000铃钱还在手里。
假如此刻不重置所有人的进度的话,玩家A的岛上还留着玩家B留下的钱,这么一来……钱被复制了!这个场景就是一个经典的数据同步问题。
可能看到这里会有读者感到奇怪:我们也玩过那么多网游,没听说过哪个游戏谁掉线了之类的就会让别人复制或者丢档之类的啊?原因是因为我们通常所玩的绝大多数的网游,都是用户直接连接游戏运营方的服务器,即:主从式模式(Client–server model)。
大部分重要的游戏数据,比如玩家所持的道具金钱等都存储在游戏服务器上,并也在只在服务器上做改变,玩家的客户端,游戏主机,电脑或是手机,只是一个 “终端”,负责与服务器之间的交互,接收玩家的操作,把结果显示给玩家等。
所以玩家的游戏终端所发生的问题都不会影响到服务器上的数据,更不会影响到其他玩家。而《集合啦!动物森友会》这样的游戏,作为一定程度上拥有自己存档的 “单机游戏”,在联机上将会和前文提的网游有着很大的不同。
每一名玩家都拥有自己的本地存档,而为了确保在联机前后玩家们的数据是同步的,且不会出现比如复制这样的漏洞,这便引出了我们接下来要讨论的话题:分布式数据的同步问题。
数据同步问题
分布式这个概念可能对于现代的人来说既熟悉也陌生,或者广义上有人也会把这种概念称作“云”。
但其实关于这方面的概念和技术在计算机领域已经深入研究了几十年了,这其中数据同步是一个细分的技术领域,很多问题至今也没有完美的解决方案。
我们不会在这篇文章中讨论这些复杂的计算机科学技术,但可以借此机会管中窥豹,同时探讨下是否有更好的联机方案。我在接下来的内容中会尽可能简化联机模型,真实的运作机制肯定还会有更多细节上的步骤。
分布式数据的同步会引出一些单机所没有的问题。主要的问题为:
主机间同步的数据是否准确一致;
主机之间数据通讯所产生的时间延迟;
数据不同步或发生错误时的应对方法。
我们先看看《集合啦!动物森友会》的联机模式时如何解决这些问题的。
最简单的情况,玩家A开放小岛,稍后玩家B进入,过一段时间后玩家B离开小岛。容我用图表来表示这其中数据存档的过程。
玩家A在开放岛屿后,会进入 “联机模式”,此刻开始产生的数据不会再自动保存,直到下次保存事件的发生。玩家B申请进入玩家A的岛屿时,此刻玩家A将会保存当前数据,并把小岛的信息发送给玩家B,这时玩家B也会自动保存,接收完小岛数据后,进入玩家A的小岛。
在此时,玩家A和玩家B在该岛上实现了数据的同步。在这期间虽然玩家可以互动,数据也在实时交换,但并没有写入到玩家们本地的存档中。直到玩家B申请离开小岛,双方的主机才正式保存数据,给这次出岛游画上了个句号。
那么保存的数据是否准确同步呢?由于双方都在实时更新数据,只要其中没有发生错误,没有人篡改本地数据作弊,那么理论上数据是同步的,当然游戏也会通过校验来确保双方在岛上共通发生过的事情是一样的。
再来看第二点延迟问题,由于网络传输不可避免的会有延迟,这可能会导致保存的数据存在误差。具体来说举个例子,玩家B往地上刚扔了一大袋子铃钱,假如在此时刻双方玩家同时保存,玩家A由于网络延迟还没有收到玩家B扔下钱的信息,保存的数据中地上没有钱。
在玩家B的保存数据中自己已经把钱扔在了地上。所以在双方的保存数据集合里,这袋子钱凭空消失了。为了避免发生类似的情况,最简单的办法就是设立一个保存前的延迟时间来给予信息足够的时间来传输。
是的,你肯定想到了,这就是为何在有人进出岛的时候有那么隆重的 “仪式”,这都是为了给予存档前必要的延迟时间来同步,包括数据时间戳检查:判断以哪位玩家的待保存记录为最新时间,数据校验等等。确保万无一失后,各个玩家的主机才会开始正式保存。
那么遇到了数据无法同步或者其他错误,比如哪位玩家掉线了怎么办呢?很简单,大家也都知道了,就是 “炸岛”,所有玩家的存档回到上一次的保存点,中间发生的数据全部丢失。
在更多玩家加入后,运作机制同理。可以看出,这套机制姑且不提玩家们的游戏体验,至少很好地完成了在不同玩家主机间同步数据存档的任务。不会出现复制丢失等漏洞,在功能上是合格的。
解决问题的可能
任天堂以做出优质体验的游戏著称,但当前的多人联机体验显然不能让所有人完全满意,即使这样的设计可能是该游戏开发团队的工程师们左右权衡后的结果。但我们是否有可能设计出满足了以上基本功能,并且尽可能去顾及玩家们的游戏体验的联机机制呢?
我们来先试试直接解决当前玩家们的痛点。
能否省略玩家进出岛时的 “欢迎/送别仪式”:前文中提到过,这段时间不仅仅是用来加载目标小岛的数据,更是用来同步和存储玩家之间的数据,如果取消或者缩短的话,很可能会影响到数据能否成功同步,对于网络环境恶劣的联机环境下更是尤为重要。
不过在有玩家入岛时,岛上的玩家会显示“好像有人来玩了”,在这一小段等待时间后,岛上的玩家会同时进行保存。理论上在此时刻已经完成了玩家间的数据同步,之后等待新上岛的玩家加载数据的这段时间,应该是可以省略掉的。
假如其他玩家在保存完毕后就可以正常进行游戏了,新入岛的玩家还需要有一段加载小岛数据的时间,这段时间结束后还需要同步其他玩家在这段时间内所产生的数据。如果有玩家还处于未上岛还在加载小岛数据的时候,有新的玩家申请上岛等,这就又是一系列新的问题了。
能否避免“炸岛”:当有玩家意外断开连接的时候,为了防止数据无法同步,所有玩家退回到上一次的存档点在当前的联机机制中可能是唯一的选择。
但也许我们可以尝试尽可能减少玩家的损失,比如开启定时自动存档如何呢?听上去似乎是个简单易行的办法,但稍微想一下就会明白,这和之前提到的为什么玩家在进出岛时有着欢送仪式有着同样的问题:存档需要同步。
需要一段同步时间并在这期间阻止玩家产生任何数据更改行为。简单来说就是如果有定时自动存档的话,岛上的玩家们可能会时不时被打断并暂停住,等待所有玩家同步保存完成,再继续活动。无法做到单机模式那样自动存档不会对游玩产生影响。
进一步来看,存档间隔时间如果设置的短,时不时的暂停住会很影响游戏的流畅性。间隔时间长,“炸岛”后的损失和沮丧感又会增加。
尝试网游式的联机模式
既然通常的主从式模式的网游不会发生这个问题,那动森的联机机制是否也可以拥有一个公共的服务器来处理岛上的内容,变成主从式呢?理论上来说这是可行的,但并不实际,核心根源在于动物之森不是真正的网游,游玩之前不必须联网。
来试着设想一下这种模式将会发生什么。岛主在开启小岛大门的时候,岛上的数据上传至官方的服务器,服务器准备好了提供公共联机服务。
岛主也作为用户之一登陆进了自己的小岛,交互所产生的数据全部保存在服务器上。其他玩家登陆上岛也是同理,随时进出小岛,离开小岛时就自己和服务器同步后保存,不再存在玩家之间的同步问题,一切看上去都那么美好。
那么如果有人掉线了呢?好像也不会有什么问题,对吗?答案是否定的,有玩家掉线,虽然对其他玩家不会有直接影响,但掉线的玩家主机上还有着本地存档,这就意味着这个存档与服务器是不同步的。
所以为了让数据同步,这个玩家必须要再连接进这个小岛,同步数据后正常离开才可以。在这之前不容许离线单机游玩。
更麻烦的是,如果有玩家掉线后岛主想关闭大门,这个岛是否结束在服务器上的服务呢?之前掉线的玩家怎么办,难道还要必须等对方上线才能结束吗?这种种问题使得这种模式并不切合实际,更不用提这种联机模式对于服务器的压力有多大,出于成本考虑也不会是个好的选择。
结语
由于《集合啦!动物森友会》是个有着本地存档的单机游戏这个固有属性使然,在多人联机方面需要面临种种挑战。希望这篇文章能对大家对于当前动森联机模式的种种不便给出一个简单的解答。在这些看似不完善的模式背后,可能也是工程师与开发人员的妥协与无奈。
最后,由于本人对于动森网络联机的实际运作机制以及细节并不了解,以上原理是根据对于游戏运作时展示的特征,结合相关知识进行的假设。若有错误,恳请指教。
本文来自微信公众号:机核(ID:gamecores),作者:van灵指引我