从技术角度分析,Niantic 为什么要推 Ingress Prime?· Now Playing DLC #2 cover

从技术角度分析,Niantic 为什么要推 Ingress Prime?· Now Playing DLC #2

这绝不是一场简单的「换皮」。

Now Playing DLC 是 Now Playing 专栏的番外篇。在 DLC 中,我们从游戏出发,聊聊科技、人性和社会,偶尔说点硬核话题。不定期更新,不影响正常专栏更新频率。

自从 2018 年 9 月推出以来,Ingress Prime 就以让玩家猝不及防的改动,以及各种迷幻 bug 和操作,成功收到不少玩家差评。许多玩家不理解,Ingress 1.0 的底层技术已经使用超过近 5 年,Prime 推出之后也并没有新的玩法与游戏系统,Niantic 为什么要一意孤行,推出看上去会「招骂」的 Ingress Prime 呢?

虽然我也是倾向于批评 Niantic 的一批人(毕竟迷幻操作实在是太多),但是在 Prime 的问题上我必须要为 Niantic 说一句公道话:以公开资料来看,Ingress Prime 不仅使用新的游戏渲染引擎把客户端重写一遍,其后台服务器程序也完全翻了个新,也就是说,从技术角度而言,Ingress 的新旧两个版本已经完全可以算作完全不同的游戏。作为一个有 2000 万下载量的服务(游戏),再加上重写 Ingress 时期 Niantic 实际上还在开发另一款话题作品(《哈利·波特:巫师联盟》),这个开发压力和强度对于任何一个游戏公司来说,都无法一笔带过。

Niantic 的游戏发家史

要说起 Niantic 为何要重写 Ingress,这就要从 Niantic 的创业史开始说起。

Niantic 团队成立于 2010 年,其创始人 John Hanke 原本是在 Keyhole 负责 Google Earth 的开发,之后在 Google 内部创建 Niantic 工作室。

Niantic 的第一款产品并不是 Ingress,甚至不是一款游戏。他们的第一款产品名叫 FieldTrip,这是一款虚拟导游 app,但和景区或者旅游风景区用的那种 app 或者小程序不一样,它通过 GPS 和 Google Maps 的数据,在用户到达风景名胜或是奇观旁边时候,FieldTrip 就会弹出这里的背景小知识。很明显,Ingress 正延续了这种思想。

FieldTrip app 本身就带有浓郁的 Google Earth 气质。

Ingress 从 2012 年 11 月开始内测,10 个月后开始公测,又在两个月后正式上线。Ingress 1.0 使用 RoboVM 和 libGDX 作为其游戏渲染引擎。作为 Google 旗下的游戏之一,那么后台使用 Google 自家云服务、登录游戏帐户只用 Google 自家的帐户自然也不会有什么问题。如果你在 Android 上使用过旧版的 Ingress,那么授权页面的应用名称显示的并非 Ingress,而是 Google App Engine,这个略显奇怪的名字正是 Google 旗下云服务的名称,大概也在揭示 Ingress「亲儿子」的真身。

如此相安无事几年之后,Google 正式宣布重组为 Alphabet,而 Niantic 就在这次重组过程中,正式成为一家独立公司。2016 年,Niantic 正式推出 Pokémon GO 游戏。Pokémon GO 从一开始就使用大家耳熟能详的 Unity 引擎,云服务也改为使用 AWS,帐户体系也正式摆脱 Google 的控制,增加 Facebook、Pokémon Club 和 Niantic Kids 帐户登录。事实也表明,Pokémon GO 在手机上的运行表现,的确要比旧版 Ingress 强上不少,支持多种社交帐户也帮助 Niantic 吸引更多新用户入坑。

旧版 Ingress 不如 Pokémon GO 不是没有原因的,其中就有 RoboVM 一份「功劳」。彼时负责 RoboVM 开发的公司 Xamarin 被微软收购,又终止对 RoboVM 的持续开发和支持。Niantic 显然没有理由继续使用一个已经被杀死的平台,向新平台迁移已经成为必然的一步。

另一方面,Ingress 在帐户系统方面受到不少 Google 时期的影响:与 Google 帐户的「强绑定」在前期当然写起来爽,但无法使用多种登录方式进入游戏,也间接导致 Niantic 之间不同游戏的体验会带有割裂感。同时,如果要为 Ingress 新增玩法,那么更健壮、更可靠的后台代码也是不可或缺的一部分。

后台:几乎没有感知的「貍猫换太子」

整个重写过程中,最耐人寻味的部分就是后台系统的重构。

我们先来整理一下目前 Ingress 新旧版本的登录限制与处理逻辑:

  • 在 Ingress 1.0 时期已经注册帐户的玩家,既可以无缝直接登录 Ingress Prime,也可以继续使用兼容的旧版 Ingress(即 Scanner[REDACTED]),信息在新旧两个系统间同步。
  • 新玩家(没有登录过 Ingress 1.0 的玩家)只能通过新的 Ingress Prime 注册新帐户。
  • 如果玩家在 Pokémon GO 同时关联 Google 和 Facebook 帐户,关联关系在 Ingress Prime 中依然有效。反之亦然。
  • 没有使用过 Ingress Prime 的玩家,将无法登录官方论坛(即使是旧版 Ingress 的玩家)。

然后还有一些有公开报道的意外及特殊网络下的情况:

  • Ingress Prime 初期出现过旧帐户登录被判定为新特工且重新建立帐户的事件。
  • 使用旧兼容版 Ingress 的「邀请」功能,可以帮助新玩家重新使用旧兼容版 Ingress。
  • 在特定网络环境下,Ingress Prime 可以正常游戏(登录除外),但旧兼容版 Ingress 不行。

从这几点很明显看得出来的是,新旧 Ingress 版本实际上是完全不通用的,至少 Niantic 为 Ingress Prime 完全重新创建了新的后台实例,否则无法解释为何新旧版本间会出现「新帐户误判」的情况发生(这个错误实在是太低级)、旧兼容版玩家依然需要全程使用特殊网络手段进行游戏而 Prime 不需要,以及为何一直使用旧(兼容)版 Ingress 玩家无法登录论坛。

那么为什么新旧版本间可以做到数据无缝同步迁移?这就是整个系统重构之中最有趣的地方:相信即使 Niantic 并不打算放出一个旧兼容版 Ingress,无缝迁移也一定是在新的后台系统的开发目标之中,否则要么旧有帐户数据会在新版本中被清空,要么新版本推出后旧版本会直接「断崖式」无法登录;也无法解释为何 Niantic 能反常地做到在短短几周之内宣布兼容版本(通常他们做出如此巨大系统调整,都需要至少 1~2 个月的时间)。

Niantic 在帐户层面和游戏地图数据上采用两种完全不同的数据迁移方案。首先是游戏地图数据。在我的猜想中,新旧两个版本实际上共享同一数据库实例中的所有游戏地图数据。使用两个数据库实例并不是不可能,但因为对于 Ingress 这种追求「情报同步」的游戏来说,两个数据库实例间必然出现的同步延迟显然是不可接受的;另一方面,两个数据库实例意味着更高的数据库维护成本,再加上本身对两个数据库实例间的数据同步算法,也会增加对服务器资源的不必要占用。基于以上理由,两个数据库实例的方案自然不是最佳方案。

那么这些游戏地图数据,现在放在哪里呢?从未来更新的角度而言,Niantic 更有可能将它放到新实例下。虽然这样做可能会有不可避免的迁移过程,但对于未来加入新玩法和新功能来说,直接将数据迁移到新实例是一个更可靠的选择。

问题又来了:数据迁移到新服务器(实例)之后,旧兼容版本如何访问数据呢?我曾听说旧兼容版 Ingress 对应服务器有「数据代理机制」来做到数据同步,也就是说,当旧兼容版本 Ingress 访问旧服务器时,旧服务器会以「请求代理」的方式向新服务器发送对等请求,也就是说,旧兼容版本的服务器在地图数据上已经是新版本的「傀儡」,自身实际上已经不再处理这方面的数据。如果按照上面的猜想为前提的话,这个说法应当是合理、可靠,也是可以自圆其说的。

接下来是游戏帐户数据部分,这部分更加不可思议。

首先可以肯定的是,Ingress 的旧游戏帐户数据没有完全迁移至新的实例中,否则不会出现之前提到的「丢帐户」情况;另一个可以确定的是,特工(玩家)资料也是全部迁移到新的实例中,至少能保证数据同步不会有延时(基于以上理由),以及特工操作签名(portal 所有者、resonator 部署者等等操作)功能上能够正常使用。

前面我们提到,1.0 时代的 Ingress 帐户系统中,「帐户」与「特工资料」实际上是一体化的。换句话说,你的 Google 帐户与特工资料被绑定在同一张数据表中,也不可避免地造成多个社交网络帐户间关联的困难。

依我的看法,Niantic 从 Pokémon GO 时期开始,就已开始着手建立全新的帐户体系,以应对未来新老产品在这方面的需求。这套系统不仅能够保证用户可以使用诸如 Google、Facebook 等帐户登录与关联体验顺畅,同时还能保证在这些服务用户协议不支持儿童登录的前提下,保证旗下支持儿童游玩的游戏能够让儿童登录,并带上家长控制功能。

最终的结果就是 Niantic 自己开发的、完全独立于其他服务的帐户系统。这套系统在将来能够支持 Ingress Prime 在内的所有新游戏的帐户管理需求,同时具有不同游戏间的同一凭证特性,但对大部分人而言只是一个「Sign in with Google」或者「Sign in with Facebook」按钮而已。

Niantic 与 SuperAwesome 合作推出的新的儿童帐户体系 Niantic Kids。至此,你可以用 4 种不同类型的帐户来登录 Niantic 旗下游戏。

接下来是更有意思的部分:强行将游戏内的特工资料与 Google 帐户的关联断开,也无法直接连接至 Niantic 帐户,必然需要一个「重新关联」的过程,保证帐户正常从 Google 的关联变成 Niantic 帐户的关联。

用以上逻辑为前提考虑,当一名 1.0 老玩家在使用 Google 帐户登录 Ingress Prime 的时候,发生的事情应该是这样的:

  • 用户请求使用 Google 帐户登录,Ingress Prime 客户端接到请求后,由 Niantic 帐户服务器完成登录过程。
  • Niantic 帐户服务器会检查当前 Google 帐户是否具有相关 Niantic 帐户,如果没有,为其新建一个。
  • Niantic 帐户服务器将登录成功的凭证和 Google 帐户信息传回给 Ingress Prime 服务器。
  • Ingress Prime 服务器会发现该用户不存在对应的特工资料,但不会立即为该玩家新建一个特工资料,而是会优先将 Google 帐户信息再传到旧的 Ingress 服务器,询问该玩家之前是否登录过旧版 Ingress。
  • 旧版 Ingress 服务器根据 Prime 服务器传过来的帐户资料,查找到对应特工资料的 codename(或特工资料在内部的编号等等),并返回给 Prime 服务器。旧服务器不会修改自身数据库中任何数据,保证老用户能够正常使用旧兼容版登录游戏。
  • Prime 服务器根据 codename 或内部编号查询数据库,将新的 Niantic 帐户凭证关联至对应特工资料下,并删除原有的 Google 帐户关联数据。
与上面步骤对应的时序图。

当然,以上步骤有可能有所出入:例如旧版关联数据一并迁移至新版(也就是所有与 Ingress 相关的数据都从旧实例迁移到了新实例),理论上也能完成以上步骤,但如此就无法解释为何旧版本中的邀请好友功能为何能够正常使用,甚至能让新玩家玩上旧兼容版。

自此,我们可以理解为何在 Pokémon GO 的其他帐户关联数据能够直接反映在 Ingress Prime 中,也可以理解为何 Ingress 官方论坛只能支持登录过 Prime 的特工进入论坛:Ingress 官方论坛的登录是直接通过 Niantic 帐户来完成的,如果你没有登录过 Ingress Prime,你自然是没有「注册」过 Niantic 帐户,官方论坛自然也不知道你是谁了。

综上所述,至少在帐户系统和新旧版本无缝迁移方面,Niantic 已经可以说是「煞费苦心」。从实际效果而言,Ingress Prime 也确实做到了几乎平滑迁移(除了有几单翻车实例,以及 Prime 服务器出现配置问题,导致 Prime 客户端无法正常访问)。在用户层面没有任何感知(维护)的前提下,能够做到如此巨大的后端更迭,只能说 Niantic 不愧是 Google 出身的团队。

客户端:猩猩果然还是不太会玩 Unity

讽刺的是,真正面向用户的部分,也就是游戏客户端,就显然没有后台客户端那么用心了。从 2018 年 9 月前后 Ingerss Prime 正式问世到现在,Niantic 一直在修复 Ingress Prime 客户端上的问题。所幸到今天,Ingress Prime 的游戏体验与旧版 Ingress 差异已经不算特别大,乐观估计,到旧兼容版 Ingress 正式「退役」之前,Prime 确实能够胜任「主力 Scanner」的位置。

从某种角度而言,Niantic 上线 Ingress Prime 更像是「在 deadline 之前交作业」的行为:旧版 Ingress 所使用框架与即将在秋天发布的 iOS 12 有严重兼容性问题,而 Niantic 认为最好的解决方式就是直接推出 Ingress Prime。只可惜他们似乎并没有那么多人手可以在如此短的时间内来优化客户端,导致 Ingress Prime 开放下载的时候给人的第一观感是「小毛病太多」;又因为本身游戏玩法没有改动,但操作逻辑与旧版完全不同,诸多老玩家很难适应如此剧变。

官方的 Known Issue 表格已经堆了不少 bugs。

但从另一方面来说,Niantic 推出 Ingress Prime 的好处也更多:作为一款已经存在超过五年的老游戏,原有的代码已经很难承载新游戏要素的需求,特别是旧版客户端所使用的框架已经注定无法继续长期使用。新的 Ingress Prime 与 Pokémon GO 和《哈利波特·巫师联盟》相同的 Unity 引擎,显然能够做到诸多代码的复用,避免无意义的重复开发过程——对于开发规模远未成规模的游戏公司而言,这样做的好处显而易见;更不用提 Niantic 还在提出自己的 AR 游戏开发平台。

好消息是,Niantic 全球社群经理 Andrew 在 Ask Me Anything 活动上表示,Niantic 目前主要精力会放在让 Prime 拥有与旧版 Ingress 接近的体验,以及对于新玩法的开发。期待届时 Ingress Prime 可以以更好的面貌与大家见面。

总结

依技术角度,从旧 Ingress 到 Ingress Prime,Niantic 更多地将精力花费在后台系统之上,但对于客户端却有些「偏科」。不过 Niantic 本身的努力不应该因为无法被看见而被埋没。

首先,Ingress Prime 正式扫清 Ingress 接近六年历史中的所有技术包袱和欠债,并正式接入到 Niantic 全新的游戏帐户体系,相信未来会为玩家带来更为无缝的游戏体验;其次,在客户端层面也正式重新推出新的用户界面,虽然这套新界面对于多数老玩家尚需时间进行适应,而且也有从自家其他游戏「抄作业」的嫌疑,但新界面至少摆脱了不少「工程师味道」,变得更为时尚和亮眼,相信这也是 Niantic 为吸引更多潜在 Ingress 特工的某种手段。

Niantic 的产品,明显离「触动人心」还有很长距离。

至此,Niantic 算是完成(他们宣称的)「重启(reboot)」Ingress 这款游戏的第一个阶段。但显然这还远远不够:目前的 Ingress 显然还不能完全胜任作为自家旗下游戏「基石」之位。如何保持长青,是 Ingress 下一个阶段需要重新思考的问题,也是 Niantic 正在努力的方向,Ingress Prime 显然只是第一步。