可能有人提出:从众人视角恢复全景世界是个伪命题——直接从太虚公司初始背景数据恢复不行吗?
不行,因为现在的虚拟世界游戏,复杂到已经和现实世界,从人的感觉上讲,没什么区别。
现在的虚拟现实游戏,会因玩家的不同,甚至同一个玩家在不同状态下玩的不同,其场景、道具、服饰等等发生万千变化。例如:玩家D扮演的张飞,在和玩家B扮演的关羽打闹时,将关羽的战袍撕了个口子……这样个性化的场景,太虚公司如何从原始数据复原?只能从众人视角努力复原。
6
再一个问题是“虚拟世界”能无限地模拟现实世界吗?
有一个理论认为:“虚拟世界”无法无限地去模拟真实的现实世界。因为“虚拟世界”的复杂度永远无法和现实世界的复杂度相比。所以,这也就有了一个推论:只要穷尽某一个维度,就能区分“虚拟世界”和现实世界。例如:你挖坑,现实世界只要你工具得当,总是可以一直挖下去,而“虚拟世界”能否挖下去,取决于事先是否准备了这方面的基础数据:“虚拟世界”里仅仅构造了一个地面,还是构造了一个地球模型?如果是前者,挖第一下就挖不下去了。再比如,你在现实世界徒步旅行,你可以走遍整个欧亚大陆,甚至跨海走到南极洲。而在“虚拟世界”里,如果仅仅构造了你所在的城市,你走到城市边缘就走不下去了。特别的例子:在“虚拟三国”你如果不想参加赤壁之战,而是一直往南走,理论上是可以一直走到越南的位置。但实际走到湖南一带就走不下去了,因为开发方没有准备相应的数据。
但这仅仅是我本人的认识。
比尔说我说的这个问题在他们那不算个问题。原因在于:尽管现实世界是无限的,但一个人的切身感受却是有限的。以我说的“虚拟三国”中徒步南方为例,开发方只需构造一个足够大的循环场景就解决了。比如:湖南境内的循环场景,连绵不绝的群山,这个人在湖南境内兜圈子,和他一直往南走,其实他自己是分不清的。
7
最后一个简单而重要的问题:仍以“虚拟三国”为例,里面众多士兵怎么来的?应该没有玩家想着扮演士兵吧?
比尔坦言:他们编写了36个士兵的标准类,所有士兵都是这些标准类的实例。
那么一个士兵的标准类,包括哪些内容?简单说生老病死,复杂点说包括:入伍前的活动,出生、入学、习武……入伍后的活动,行军打仗、出生入死……
我好奇,同一个士兵类生成的实例,是不是就是完全相同的两个士兵?
比尔说,没那么简单,他们要引入随机函数,细节上会有不同,比如:出生地一个在徐州,另一个在襄阳……但大的方面是一致的,比如:都安排在赤壁之战中阵亡。
他此一说,我不免心中一动。
我又问,所有士兵其实只有这36种安排咯?
他说是,但没有人会感觉少。就像有哲学家概括人生其实就四个字“生老病死”一样。
我猛然想到“三人同命”!
再回到士兵问题,太虚公司创建了成千上万个士兵实例后,士兵的行为怎么控制?我认为引入了随机变量,士兵行为是随机的。
比尔说:这有个小技巧,相当于计算机操作系统中的广播机制:在虚拟场景中广播集合,士兵们就列队集合;广播冲锋,士兵就冲锋……
我好奇具体的广播形式。
他笑了,各种方式,比如内部消息机制,但肯定不会是真的用大喇叭喊,那样其他玩家都会听见。别的方式,比如利用星空中星星眨眼,或者利用闪电!
我又想到了冷湖之光。
我在和比尔的闲谈中,他又给我透露了一些重要信息,从而让我对“三人同命”事件有了一个全新的认识。
比尔无意中告诉我,在用类构建士兵的过程中,严格讲,应该在每一个地方都引入随机函数,这样能保证无论从什么地方,哪怕相隔千里,也几乎不会找到两个完全一样的士兵。
但实际程序员为了省事,就会选择理论上不会有冲突的地方大量复制代码,比如一个事件发生在成都,一个发生在大连,相距太远,一般不会有交集,就把成都的代码直接复制到大连使用。这种情况下,尽管使用了随机函数,但也是伪随机函数。
看我不明白,他解释道:比如从1-5里随机取数,可能取的数序列是43251,下次可能就是32145……每次取生成的序列都不同,这叫真正随机数。
但我们实际使用的随机函数,每次产生的随机数序列可能都是43251,这就叫伪随机数。为了避免伪随机就需要引入其他初始条件,比如取当前时间的秒数。
但很多程序员为了省事就直接用了伪随机数……
结果就是这种情况下,完全有可能大连某人和成都某人完全相同。
但是也没必要重写程序,他们有更省事的方法,就是RESET,重置。重置时钟、重置初始变量。