无人深空如何通过程序生成 18,446,744,073,709,551,616 个不同的星球?

1 条评论


  • 14

    Venceremostiny valor

    skream假面女仆卫士Yoge 等 14人赞同

    以下内容全部来自http://steamcn.com/forum.php?mod=viewthread&tid=172798


    【1."宇宙"是怎么产生的?】

    为了解释这个问题,我将用比较通俗的方法来为大家讲述“过程算法”。不一定是非常严谨的科学语言,但作为科普文,我希望能让更多的人看懂。因此专业人士请手下留情。

    现在,请先让我们回忆起那个神秘的无理数——π:3.141592654....
    我们把这个数字按位/格子写在一条很长很长的纸带上。
    为了便于理解,请先想象/认为宇宙是"一维"的,各个星球是排列在一条线上的。数学知识告诉我们这个无理数是无穷的,如果我们为这个数字加上几条规则:
    1.遇到1时,代表这是个恒星。
    2.遇到2时,代表这是个行星。
    3...............以此类推
    那么此时,我就产生了一个“一维”的宇宙。而且由于π的各个位的数字并不是按规律排列的,因此你会感觉这个"宇宙"似乎是随机的。
    但我们都知道π是个定值,也就是说此时生成的这个宇宙并不是完全随机的。它就在那里,并不会因为你每次开启游戏都要实时模拟出一个真的宇宙。

    现实中,宇宙是个多维的。因此,我们现在可以为这条"纸带"多拉出几个方向(上下左右前后任意组合),并进行任意数字有规律叠加。同时也为它制定一系列复杂得多的规则,于是一个完全有几条"纸带"构成的看似随机的宇宙诞生了。而你的电脑里却不过是记录了一些简单的数据。

    专业点来说,开发者们通过一些复杂的"函数"创建了这个多维的数组("纸带集合")。这就是这个游戏宇宙的生产办法。(要知道计算机求π的计算式子是π=16arctg1/5-4arctg1/239 ,也是一个函数)

    总结一句:18,446,744,073,709,551,616个星球看似很多,但并不占什么数据量,只不过是一些可由计算获得的数据,通过一系列形成规则,构成了这个看似无限的游戏宇宙。正如你不需要完全记忆π一样,这么多星球的数据也并不要完全存在硬盘里,你只需要知道怎么计算它,并在需要的时候算出来就行。至于怎么算...往下看:

    ----------------

    或许你可能仍有疑问。但是别怕,请接着往下看。

    我看到有人质疑,我的硬盘放得下这么大的宇宙么?
    我要告诉你,可以的。实际上你的电脑里只存放了一个类似 Ta=a(1-sinθ)和x2+y2-a×x=a×sqrt(x2+y2)这样的式子(实际上会更复杂),你每次遇到的星球,不过是CPU为这个式子带入一个值,计算后获得的相关数据。比如0x135486754(代表了这是个靠近恒星的沙漠星球以及有小型植物等等等)。

    又有人会发问,我的CPU来得及计算这么大的数据么?
    我要告诉你可以的。具体的过程简单一两句话说不清,但是要知道,官方给出的最低配置是i3。

    还有人问,这么多的星球,怎么确保它会和其他的星球不一样,生物长相怎么模拟?

    同样的道理,开发者既然有办法写一个函数就一定有另外一个方法写另外一个函数。
    开发者预置了不少的贴图,并如上赋予了不少的规则。如
    1.遇到1代表这个生物高2m
    2.遇到2代表这个生物的嘴型是数据库里编号为0x75的那张贴图
    3..............
    实际方法会很复杂,但是实现原理大致如上。

    再一点,学过计算机的都会对计算机得到18,446,744,073,709,551,616以及运算这样一个复杂的函数的能力表示质疑,一是怀疑内存不够,二是担心计算能力不足。

    关于第一个问题:
    同样再次假设宇宙是一条"纸带",星球依次排列。假如在你的视野内,你可以看到5m长的纸带,那么你的内存也只需要保存着5m长的纸带,5m之外的纸带虽然依旧存在,但你并不需要记忆它们,因此实际上你并不需要记录那么多的星球。当你的飞船移动,你就把纸带移动,你可以看到后面的一部分纸带而把你身后那些已经看不见的纸带"遗忘"。
    这就是"过程生成".

    关于第二个问题:
    我们再举个例子,当你查英语字典的时候,如果你要查bull这个单词,你会先去查目录,然后从B开头的单词查起,而不会从A开头的单词查起。A/B之分实际上就是一种标签(tags)。
    同样的道理,每次你模拟这个宇宙,你并不需要从3.14159开始往下运算,只需要查明你当前的位置,通过预定在函数中的标签,只计算5m长的纸带就好了。因此看起来运算量很大,实际上并不复杂。这也就是为什么游戏敢于给出i3最低配置的原因

    ps:这部分暂时就这些,有什么没懂得或者想问的留言吧。
    刚刚有人问了,这样随机组合,到时候会不会重复度很大?
    我个人看的内部视频感觉其实还好,因为贴图是矢量图,且背后有一定量的复杂设定(变形、上色、纹理等等)作为依靠,实际演示的时候制作人告诉我刚刚那只恐龙和那条鱼用了一样的身体,我是完全没看出来的==。《孢子》游戏里也并不是有着无穷的生物组件,但通过相互间的组合创造,也弄出了数不清的奇特生物。所以我们有理由相信这个游戏里的生物的相似度也并不会太高。
    但你非要模拟出180000亿个完全不同的星球换我我都不信。毕竟158块,158块买个真实宇宙这种事...再等几百年看看吧.....

    更新于 2016-07-25 18:36:40 1 条评论


  • 6

    木落python用户,开发者,独立游戏爱好者

    木落YogeVenceremos 等 6人赞同

    其实很简单,有这样一个函数 f(x) = [a, b, c, d, e, f, ....]

    根据不同的x,产生的abcdef等也不同

    那么x就是某一星球的特征值,abcdef是星球的具体数据

    发布于 2016-07-25 19:02:44 2 条评论


  • 3

    拉普拉斯的饿膜苦逼程序员/游戏品鉴师

    本人并不知道其真正的原理,仅此作推测:

    最近有个比较火的东西,是使用以太币币养猫,每只猫都是随机生成的,并且都是独一无二的,这是因为每只猫都有着独一无二的基因图谱。而基因图谱可以用一串很长的数字字符串来进行记忆,例如,第一位控制毛发颜色,1代表白,2代表黑,3代表红;第二位代表眼睛颜色;第三位......以此类推。之后需要展示的时候再根据这串数字进行对应的渲染。

    无人深空可能也是同理,第一位代表星球总体颜色,1代表红,2代表绿,3代表......,第二位主产资源数等等。当这串数字足够长时(18,446,744,073,709,551,616 = 2^64  64位其实足以),例如256位,你将基本不可能碰见一模一样的星球。

    你可能会觉得2^256长度,这CPU能跑的动?我给你举个栗子,你上奶牛关所用得到上网协议是HTTPS的,其中包含TLS,加密算法为AES长度是256位的,MAC算法一般选用SHA128(128位),再安全一点的选用SHA256(256位),然而这些都并没有拖慢你电脑上网的速度,甚至都感觉不到使用HTTP和HTTPS的差别。

    发布于 2018-06-18 11:18:28 5 条评论


  • 3

    像素杆菌

    像素杆菌AustinMoeShan 赞同

    http://gaming.stackexchange.com/a/280904

    18,446,744,073,709,551,616 = 2^64  (2的64次方) 他们游戏生成星球的算法大概是基于一个 数值类型为 64位的 随机数种子,所以能生成64位的可能性…… 

    发布于 2017-02-21 20:37:55 0 条评论


  • 0

    聪明的豆芽即时策略游戏爱好者,坦克世界大神级玩家

    去看看“机器学习“,或许你能有收获。


    通过不断的输入数据,获得一个规律,然后用这个规律生成N多结果。

    发布于 2017-02-24 11:32:46 0 条评论

  • 登录奶牛关账号即可参与讨论

{{question['follower_count']}} 个玩家关注

...

相关元素

相关游戏

相关问题

目前最前沿的体感技术有哪些?

6人关注 4个回答

为什么数字游戏这么方便主机厂商还要继续售卖实体游戏?

14人关注 13个回答

如果让孩子接触主机游戏,是否能达到防止沉迷在王者荣耀,英雄联盟等游戏中?

16人关注 16个回答