别的事情也会发生
虽然支撑虚拟世界的硬件上,负载主要来自玩家,但玩家并不是唯一的来源。不管有没有玩家在场,都会有事情发生。这些事里有些是机械式的:虚拟世界的太阳照常升起、落下,天气照常来去,全都不管周围有没有玩家。对于一个细节极其丰富的世界来说,这些加起来可能意味着相当可观的工作量(一阵微风吹动树上的一片片叶子,其中一片飘落下来,掉进小溪,溪水懒洋洋地把它送进河流,再由河流送进大海)。不过,眼下要做出这么复杂的虚拟世界,还差得远呢。
更麻烦的,是虚拟世界里那些虚拟生物。它们通常被称为 mobiles 1(活动体,简称 mob),代表着居住在虚拟世界里的怪物和非玩家角色。第 4 章“世界设计”会更详细地讨论它们,但眼下让我们操心的是:它们的行为必须显得可信。这需要人工智能技术,而这类技术吞噬起计算资源来,别的东西都比不上。哪怕只是简单的寻路,也是 CPU 周期填不满的无底洞。要是能有一座虚拟城市,住着 10 万个虚拟居民,每个居民都在实时决定自己的虚拟人生怎么过,那该多好。不过,要等到这一天,我们恐怕还得等上一阵子。
如果设计者想要的 mobiles 数量超出了服务器能承受的范围,他们就必须拿出管理这些 mobiles 的办法。经典的做法是:暂停处理那些行为不会被玩家直接看到的 mobiles。造成 AI 负载的,不是一台子服务器上有多少 mobiles,而是同一时刻处于活动状态的有多少。
设想一座村庄里的一群哥布林。附近没有玩家时,让这些哥布林做任何事都没有意义。当然,子服务器在负载不太重的时候,可以让它们稍微走动走动,但玩家有优先权。只有当一群冒险者出现时,才轮到激活这些哥布林:让它们表现得聪明一点,让玩家们好好费一番功夫。玩家一走,死掉的哥布林就可以重新生成,等着下一批冒险者。
如果设计者想要的 mobiles 超过了程序员所说的上限,他们可能会忍不住采用这种“就近激活”的做法。不过,他们必须意识到:自己做的每一个决定都有后果。
在这个例子里,后果落在因果关系上。如果一棵树在沙漠里倒下,它会发出声响吗?可要是采用就近激活,这棵树压根儿不会倒下。
再设想第二支哥布林劫掠队。它从营地出发,杀掉村民的几只羊,然后带着战利品回到营地。村民们很生气,出钱雇玩家去杀掉这些哥布林。
这是够玩一个晚上的任务。
而如果哥布林一直待在自己的营地里,直到某个玩家偶然撞见它们,这个够玩一个晚上的任务就永远不会出现。
当然,绕过这个问题的办法立刻就能想出很多,但这不是重点:重要的是,设计者首先得意识到可能存在的问题。你提出的解决办法,自身会不会也带来问题?要是我不问,你会想到这一点吗?
虚拟世界设计,关乎后果。
出自《MUD1》的“mobile objects”(活动体)。我之所以这么叫,是因为那些以受控却不可预测的方式移动的生物,就像挂在天花板上的那种“mobiles”(活动雕塑)一样。呃,我当时有点赶时间…… ↩︎