« 开发笔记(29) : agent 跨机 id 同步问题 | 返回首页 | 闲扯几句图形界面的设计 »

相位技术的实现

魔兽世界从巫妖王之怒那个版本开始完善了他的 相位 (Phasing) 技术。简单说,就是在场景的相同区域,不同的玩家根据一些条件(一般是任务进度)的不同,会感受到不同的环境:场景可以不同、能交互的 NPC 不同等等。

这个技术可以给玩家在 MMO 中带来许多以往在单机游戏中才能体验的融入感。在 wow 之前,许多游戏策划都曾经想过让玩家可以通过完成剧情改变游戏的环境,但苦于找不到好的表现方式。这或许是因为大部分游戏策划都在以现实世界为参考去考虑技术能够实现的可能性,而在这个微创新年代,没有摹本可以参考就没有了思路。但我有些奇怪的是,在 wow 把相位技术展现给世界已经超过 4 年了,为啥山寨大国还没有全力跟进呢?

莫非是因为这里面还真有什么技术难点?

以前没有认真思考过相位技术如何简单的实现。我们在这期里程碑里还没有把这个提上案子,但读到我们的策划已经编写了大量剧情,似乎没有相位技术或类似的东西就无法实现啊。许多情节写的跟小说一样,动不动就天亮了、环境变了、NPC 死了、人群散了、BOSS 复活了 …… 说起来好像 wow 里某个任务就是这样做的,我们以后天然就要支持相位技术没啥问题似的。

昨天晚上就这个问题跟 mike 同学讨论了一下,初步定了个方案。

据说原来在网易的一些同学还真认真讨论过相位技术如何实现,道听途说,我也不了解细节。大致说是希望放在 AOI 模块中解决一部分问题。就是让每个玩家的可见对象受底层模块的一些参数控制,他只能看到他能看到的景物。

也就是说,不同位面的 NPC 实际上全部存在于一个场景,只是被位面约束,可能不可见而已。

我们就这个可能的解决方案做了讨论,一致认为过于复杂了。相位技术不仅仅是要解决可见性问题,还需要解决互动问题。用这个方案的难点在于,即使我们可以在玩家对象上做一个可见性过滤(这倒是在我们现在的架构上,很容易实现),也很难去处理交互问题。比如释放一个 AOE 法术攻击一个区域内的对象,就需要给法术本身也设置位面影响。而玩家可以独立在一个服务内计算,将法术对象也独立出来就不太现实。这样做的结果会带来不可控的复杂性,以及很多性能问题。

所以我们觉得采用更纯粹的方案可能更好。不一定要完全和 wow 的一致,但能满足剧情任务表现的要求即可。

简单的方案是,如果一个场景因为上面的任务线的不同,而可能有不同的位面。那么、我们就实际去制作多个不同的场景(指服务器的配置)然后全部位面都独立启动起来。

指定一个主位面,它是覆盖全地图的。其它位面都有一定的影响区域。也就是说,次位面在地图大小上和主位面一样,只是布置的 NPC 对象不同,但一般只在一个较小区域上布置。

玩家会因为任务进度的关系进入次位面,但在次位面上移动超过影响区域就自动切回主位面。玩家处于不同位面实际上是处于不同的场景服务中。但这个切换的代价是相当之小的。首先客户端并不需要移动位置,也不需要加载场景。玩家不会感觉到停顿。服务器那边,相同地图的不同位面一定是在同一进程中,只是把绑定在玩家上的 agent 切换了交互 map 而已。

第一步我们暂时实现任务链对位面切换的影响,这样策划通过配置任务表格就可以切换到他们专门为任务配置的次位面中。区分主次位面,而不是等同对待,是为了配置规则简单,而非实现上的区别。

之后,我们需要制定一些基本规则,防止在相位穿帮时有一个明确的处理规范。当然策划在应用这个技术时也需要积累一些经验,考虑对一些 PvP 玩法的影响。

这次先写这么多记录一下想法,估计要到一个月后才会开始实现。

Comments

翻译资料的时候看到这个帖子,英文是WOW技术总监关于phasing的访谈。不过估计没人能看到,就当是个漂流瓶吧。
The Death Knight starting area featured a robust story that involved your fledging death knight pillaging a town called the Scarlet Enclave from the floating fortress of the Ebon Hold. As the death knight army pushes into the town, the world itself changes from a small base camp to an army foothold. Scarlet Armies defend against your attacks, only to be gone in the next quest. In term of storytelling, it allowed Blizzard to push forward the idea that the player's actions mattered.

The technology is called phasing, replacing one version of in-game reality with another. According to Patrick Dawson, the technology is essentially all server trickery.

"Phasing is all visibility. Everything that you see, all of it exists at the same time in the same place. This actually is a big technical challenge, because you can have in one phase there be this tremendous war between the Alliance and the Horde and in another phase it's this peaceful, tranquil area because maybe the war is over," says Dawson. "If you make it go from one war to another war to another war you've now layered three phases worth of very expensive combat on top of each other; that could actually cause server issues. So we're actually really careful about that from a tactical aspect-how we did phasing-because it really was a client visibility issue. You wouldn't know what was happening in the other phases, but everything was still happening on the server in parallel."

但我有些奇怪的是,在 wow 把相位技术展现给世界已经超过 4 年了,为啥山寨大国还没有全力跟进呢?

这句话最近有感触,山寨大国的山寨皇帝腾讯已经跟进了。。

曾经也考虑过WOW中的相位问题,但一直不明白是怎么实现的。个人感觉更象将玩家移到了另一个场景管理器,最直接的体验是:在做某一任务时碰到了一个玩家,与其组队时发现是与我不同服的,而在玩成任务时,我成功的转移到了对方的服务器进行游戏(因为有提示所以知道,而对方是队长)
我一直坚信是这样子,但却让我很疑惑的是:玩武僧做职业日常(战斗时有相位变化)的时候,战斗结束后,大脚也会给一些战斗提示,而这些提示,据观察应该是其它玩家的战斗提示才对。。。

直接用副本技术实现是最简单的吧?

我觉得相位这个设定本身就很多余,很老套

我觉得相位这个设定本身就很多余,很老套

作为一个玩家,我比较讨厌相位系统。

尤其是在任务进度不同的玩家之间会造成很多困扰。(任务进度不同的玩家无法看到对方,也无法看到相同的任务怪,于是任务进度不同的玩家几乎不可能互相帮助,在这样的设定下,就像是在玩单机游戏。)

这种技术在副本、场景战役或者新手剧情任务链里使用就够了,没必要推广到副本外的世界地图上。

顺便说一句,新版本 MOP 增加的跨服地图技术带来的麻烦远多于便利。这样做还不如和 EVE Online 一样直接弄单一服务器。

魔兽相位是通过不同的buff显示不同的场景,实际上还是在同一个服务器上面。否则法师使用隐身术难道他要传送到另外的服上面吗,显然不可能。
魔兽世界的aoi不只是简单距离的判定,之中包含了好多buff参与计算。魔兽世界一切状态都是buff,明白了这点,相位其实就很简单了,比如同一个位置站了两个NPC,NPC头上带有不同的buff,玩家只能看到与自己buff相同的NPC就行了

我咋感觉相位技术就是动态npc生成呢,
有些npc是刚体,需要考虑碰撞;
有些npc不需要。

环境,任务,所有会改变的都是npc,服务器端有一个多位面的npc配置表,基于位面id动态创建npc。

1

网易出了基于Node.js的pomelo开源网游框架,对比起云风大大的skynet开源项目,云风是否能写一篇两个引擎对比的BLOG分析一下各自的优缺点呢,谢谢了。

另外,我觉的国内没COPYCAT这个是因为,大家还是觉的世界是平的好玩嘛...比如你在路上走着走着..然后看到路口转弯的地方有两伙人在PK,你就可以有三个选择:全杀...杀一边..围观...这样不是很好玩么...

说到底就是层技术啦....就像PS中的层概念一样...每个元素都有一个Z轴

首先有一个基本层Z轴为0..表达环境及其属性...然后..再来一个基本层扩展Z轴为1..以防止将来有一些变动的基本层增减的操作...最后...就是每个会动的元素都一个Z轴坐标...相同Z轴坐标的...自然就在一个世界中了..

小CASE了...

说到底就是层技术啦....就像PS中的层概念一样...每个元素都有一个Z轴

首先有一个基本层Z轴为0..表达环境及其属性...然后..再来一个基本层扩展Z轴为1..以防止将来有一些变动的基本层增减的操作...最后...就是每个会动的元素都一个Z轴坐标...相同Z轴坐标的...自然就在一个世界中了..

小CASE了...

很期待这篇文章的具体实现过程,现在很多都是通过脚本来控制一些可见信息和活动范围等。真正做到wow的效果还没见过。希望在这里可以得到一些启示。

很期待这期报告的后续,虽然只是个初级程序员,但是对这个很感兴趣.

做游戏真复杂,这个相位技术在现实中也存在,每个人的视角以及眼光不同,看到的东西也不同。

另外再说一下,现在WOW的世界地图是跨服的了,服务器共享了世界ID了

跟现在的WOW跨服一样,都是副本应用到世界地图上而已。

位面就是相同的世界,不同的世界ID,位面的切换就是切换世界ID,当然法术、NPC、AI这些计算都是基于世界ID来的。

一般来说,位面都是固定的(相对于副本来说就是副本ID,动态的,对于位面来说,就是位面ID,固定的),但是也不排除动态位面(这个应该很少出现,如果非要独占位面,其实可以用副本实现了)。

这是我对于位面的一些理解,其实大家都懂的。

跟现在的WOW跨服一样,都是副本应用到世界地图上而已。

位面就是相同的世界,不同的世界ID,位面的切换就是切换世界ID,当然法术、NPC、AI这些计算都是基于世界ID来的。

一般来说,位面都是固定的(相对于副本来说就是副本ID,动态的,对于位面来说,就是位面ID,固定的),但是也不排除动态位面(这个应该很少出现,如果非要独占位面,其实可以用副本实现了)。

这是我对于位面的一些理解,其实大家都懂的。

前段时间刚在项目中涉及这方面的改动。不过纯粹是可见性过滤。对于范围性法术,在扫描受影响对象时,也加入了过滤。思路很简单,实现也不复杂,主要是我们项目需求目前来说也很简单。

我想副本里用的会多些……如果游戏内容穿插科幻色彩,这个技术用处很大吧。。。

没认真思考过……现在想一想,wow的确应该是这样做的。

和同学一起做任务经常遇见这种情况:如果我们的任务进度不统一,一旦进入受影响区域,那么对方马上就消失了,只能在小地图上看到双方的确在一起。


事实上,我想暴雪应该是直接复用了副本技术。

我们现在的实现版本就是您所说的,服务器还是完全切一个新地图,客户端不loading而已

WOW应该也是这种, 清熊猫人任务的时候发现的.

比如交了一个任务, 周围的玩家才呈现出来.

Post a comment

非这个主题相关的留言请到:留言本