無人深空星球生成機(jī)制深度分析 為什么沒有多人聯(lián)機(jī)
- 來源:Necromanov
- 作者:售夢(mèng)者
- 編輯:售夢(mèng)者

了不起的靈感和它的詛咒
那么,這個(gè)龐大的宣傳反差,是為何誕生的呢?為什么無人深空會(huì)如此篤定他們能做出一個(gè)超級(jí)龐大,而且支持多人聯(lián)機(jī)的宇宙來(雖然他們最后并沒有做出來)?要知道,他們可只有那么小的一支團(tuán)隊(duì)(2016年的現(xiàn)在是15個(gè)人),按照游戲開發(fā)的常理來說,這簡(jiǎn)直是睜著眼睛亂吹牛皮了!15個(gè)人?做個(gè)單機(jī)手游還差不多,你們要做3A太空沙盒?是來騙經(jīng)費(fèi)的吧?!
要解答這個(gè)問題,我要從無人深空所使用的程序算法開始解釋。從某種意義上來說,無人深空這個(gè)項(xiàng)目,是整個(gè)游戲行業(yè)中極為罕見的“程序員和算法主導(dǎo)”的游戲項(xiàng)目。絕大多數(shù)的游戲,要不是游戲設(shè)計(jì)師主導(dǎo),要不是美術(shù)總監(jiān)主導(dǎo),甚至很多時(shí)候是市場(chǎng)總監(jiān)、財(cái)務(wù)總監(jiān)甚至融資總監(jiān)主導(dǎo),但極少有被程序技術(shù)算法主導(dǎo)的例子——偏偏無人深空就是那極為罕見的一個(gè)。這也是他們敢以15個(gè)人的超袖珍團(tuán)隊(duì),向所有玩家和發(fā)行商索尼描述游戲愿景的底氣。而最終,這也導(dǎo)致他們沒能完成這個(gè)架空的愿景,是游戲上市后玩家輿論給他們致命一擊的根本原因。
18,446,744,073,709,551,616這個(gè)數(shù)字是什么呢?對(duì)于學(xué)計(jì)算機(jī)的各位肯定非常熟悉——它是2的64次方,和256、65,536、4,294,697,296一樣都是計(jì)算機(jī)系的大家應(yīng)當(dāng)很熟悉的數(shù)字,代表著一個(gè)64位的2進(jìn)制數(shù)??吹竭@個(gè)數(shù)字,你就能猜出來,他們用了一個(gè)“長(zhǎng)整形變量”作為生成隨機(jī)星球的種子。
這意味著,在無人深空中,他們使用了程序化生成算法(Procedural Content Generation,一般簡(jiǎn)稱PCG)來構(gòu)成這個(gè)隨機(jī)宇宙。你能夠在很多地方見到對(duì)PCG原理的簡(jiǎn)述,甚至還有人專門寫了一篇介紹無人深空中隨機(jī)宇宙生成算法的文章,所以我在這里不再贅述這些程序化生成是怎么實(shí)現(xiàn)的。
當(dāng)然,實(shí)際上的生成算法會(huì)非常復(fù)雜,經(jīng)過很多很多步的生成,絕非我或者科普文章說的“使用一個(gè)隨機(jī)生成的長(zhǎng)整形數(shù)來隨機(jī)生成星球上的數(shù)據(jù)”這么簡(jiǎn)單。你可以想象,相對(duì)于一般游戲使用的復(fù)雜的數(shù)值表,無人深空有一張復(fù)雜的生成規(guī)則表:星球的名字如何生成、生物如何生成、地形如何生成、資源如何擺放、宇宙太空站如何生成、NPC種族如何生成、飛船如何生成、藍(lán)圖和語(yǔ)言如何生成……
而在這里面,有些問題會(huì)比其他問題更加復(fù)雜。如何生成合理的地貌?如何生成看起來合法的生態(tài)環(huán)境?每個(gè)星球上都需要生成資源和值得玩家去探索的特殊地點(diǎn),這些又怎么通過一個(gè)64位的隨機(jī)數(shù)種子去進(jìn)一步生成?在這些內(nèi)容上,團(tuán)隊(duì)必須要投入比簡(jiǎn)簡(jiǎn)單單地說“程序化生成”這三個(gè)單詞多得多的工作量。在最終的游戲零售版本中,他們實(shí)現(xiàn)了完整的基本游戲邏輯——但也只有基本的游戲邏輯而已。對(duì)于4年的開發(fā)時(shí)間來說,這個(gè)答卷完全無法令玩家滿意。
我想,那可能是因?yàn)樗麄兝速M(fèi)了很多時(shí)間,用來追尋另外一個(gè)最終失敗的目標(biāo)。很多關(guān)于無人深空的文章都說了程序化生成,但這個(gè)游戲并不僅僅是程序化生成。在這個(gè)游戲里面,還容納了一個(gè)極為罕見的靈感,也正是這個(gè)靈感,將它原本的愿景和野心暴露在了我們的面前。
因?yàn)樵谶@里還有另外一個(gè)非常重要的設(shè)計(jì)要點(diǎn):雖然這個(gè)宇宙里,有2的64次方個(gè)不同的星球,但所有人看到的宇宙都是一樣的。雖然游戲沒有聯(lián)機(jī)功能,但玩家們確實(shí)能夠看到別人上傳和命名的星球,在龐大的宇宙中找到其他玩家的蹤影,看到別人所命名的生物——這證明大家所看到的宇宙,并不純粹是用那個(gè)隨機(jī)數(shù)生成的本地?cái)?shù)據(jù),而確確實(shí)實(shí)存在于所有人的電腦之中。
但從傳統(tǒng)網(wǎng)絡(luò)游戲的實(shí)現(xiàn)方法來說,這個(gè)“所有人都能看到的宇宙”原本是不可能存在的!只要做一個(gè)簡(jiǎn)單的算術(shù),大家就能明白這一點(diǎn)了:假定一個(gè)星球的隨機(jī)生成,真的只需要一個(gè)長(zhǎng)整型變量,也就是一個(gè)64位的2進(jìn)制數(shù)(64bit)。存儲(chǔ)這個(gè)星球的隨機(jī)生成種子,就需要64位2進(jìn)制數(shù),也就是8個(gè)字節(jié)(一個(gè)字節(jié)是8bit)。
我們平時(shí)說的1MB有多大呢?有1,048,576字節(jié),能存儲(chǔ)131,072個(gè)這樣的星球(約13萬個(gè))。
1GB有多大呢?有1024MB,也就是說,能存儲(chǔ)134,217,728個(gè)這樣的星球(約1.3億個(gè))。
1TB有多大呢?這個(gè)已經(jīng)是大家一整塊硬盤的單位,有1024GB,也只能存儲(chǔ)137,438,953,472(約1374億個(gè))這樣的星球。
我們?cè)儆蒙戏?wù)器等級(jí)的硬盤,1PB=1024TB!這樣的硬盤能儲(chǔ)存多少個(gè)星球呢?140,737,488,355,328個(gè),也就是140萬億個(gè)星球的數(shù)據(jù)。沒錯(cuò),即便我們動(dòng)用了1PB這樣驚人的服務(wù)器級(jí)別硬盤,也還沒能存下這個(gè)宇宙每個(gè)星球的生成種子——遑論玩家們給這些星球和星球上的地點(diǎn)、生物們起的名字了。
那么,無人深空這個(gè)多層宇宙宇宙里,到底有多少個(gè)這樣的星球需要儲(chǔ)存呢?答案是1800億億個(gè)。我們換算成PB的話,是131,072PB——13.1萬PB的服務(wù)器,當(dāng)然遠(yuǎn)遠(yuǎn)超過一個(gè)游戲公司所能負(fù)擔(dān)的上限。
所以,他們不可能使用這么愚蠢的“傳統(tǒng)網(wǎng)絡(luò)游戲”的做法。他們需要另外一種辦法來存儲(chǔ)這個(gè)“所有玩家共存的單一宇宙”。
這就是無人深空這個(gè)游戲大愿景的另外一半:用“偽隨機(jī)數(shù)”的算法來同步所有人的宇宙。這是之前所有程序化生成游戲,從矮人要塞到孢子,都沒有想到的事情。那些使用種子生成地圖對(duì)戰(zhàn)的游戲們想到了,但是他們從未想過要把這個(gè)算法擴(kuò)大到一個(gè)真正的“大服務(wù)器游戲”上——這確確實(shí)實(shí)是一個(gè)非常瘋狂,但也相當(dāng)天才的想法。
我先來解釋一下偽隨機(jī)數(shù)的算法。對(duì)于學(xué)過計(jì)算機(jī)的人,計(jì)算機(jī)不能生成真正的隨機(jī)數(shù),只能生成偽隨機(jī)數(shù)。通過一個(gè)算法,生成一個(gè)看起來沒什么規(guī)律的大數(shù)字,然后再通過算法在這個(gè)大數(shù)字里面截取一段,之后再進(jìn)行近似操作,對(duì)我們?nèi)祟悂碚f,看起來就好像是隨機(jī)數(shù)了。
比如說最常用的偽隨機(jī)數(shù)生成算法,叫做“線性同余法”:Xi = (Xi-1 * A + C ) mod M,通過取大數(shù)字的余數(shù)來快速生成偽隨機(jī)數(shù)。懂?dāng)?shù)學(xué)或者算法的讀者應(yīng)該一看就懂,而各位不懂算法的大家不必深究,知道這是一個(gè)用于遞歸生成特定隨機(jī)數(shù)的算法就可以了。
但是,偽隨機(jī)數(shù)不是真正的隨機(jī)數(shù)。如果你玩過那些廉價(jià)計(jì)算器,就會(huì)知道這一點(diǎn):在這些計(jì)算器的偽隨機(jī)數(shù)生成模塊中,有極其明顯的規(guī)律存在。比如你使用線性同余法,只要給定了計(jì)算的次數(shù)和函數(shù)的初始值,這個(gè)隨機(jī)數(shù)序列的每一項(xiàng)都是固定的;當(dāng)這個(gè)同余數(shù)字特別小的時(shí)候,甚至還會(huì)產(chǎn)生有規(guī)律的循環(huán)和特定數(shù)字。所以會(huì)有一些安全指南,告訴程序員的大家一定不要允許其他心懷惡意的用戶在你的系統(tǒng)里連續(xù)取隨機(jī)數(shù),或者干脆就不要用語(yǔ)言提供的默認(rèn)隨機(jī)數(shù)算法(很多主流語(yǔ)言默認(rèn)都使用線性同余法);在已知使用線性同余法的情況下,他們甚至能夠通過連續(xù)取到一定數(shù)量的隨機(jī)數(shù)反推到種子。所以,通常來說,我們看到這種默認(rèn)通過一個(gè)函數(shù)來生成的算法都會(huì)覺得算法的隨機(jī)性很差;一些從眾所周知的函數(shù)(比如pi的通項(xiàng)公式)里面取值的算法就更糟糕,只要知道算法,種子瞬間就可以被破解。
實(shí)際上,我們?cè)诂F(xiàn)實(shí)生活中,也大量使用和這個(gè)“偽隨機(jī)數(shù)”原理類似的驗(yàn)證算法——最著名的驗(yàn)證算法就是被我們用于加密和驗(yàn)證的“大質(zhì)數(shù)因數(shù)分解”(著名的RSA算法)。我們大量使用的“CRC校驗(yàn)算法”其實(shí)也是個(gè)類似的應(yīng)用:只要給定輸入和算法,任何一臺(tái)計(jì)算機(jī),一定都能算出相同的結(jié)果;反過來說,只要算出了相同的結(jié)果,我們就能夠知道他們使用了相同的固定算法。
但是,在游戲領(lǐng)域,之前幾乎沒有人思考過如何反向使用“偽隨機(jī)數(shù)”這類算法。隨機(jī)性越高就越好的思維定勢(shì)很難避開,所以幾乎沒有人考慮過能不能反過來利用大隨機(jī)數(shù)序列的“偽”性來構(gòu)造復(fù)雜的設(shè)計(jì)用途。
反向是什么樣的呢?讓我們想想看“給定一個(gè)算法和種子值,任意一臺(tái)計(jì)算機(jī)都能生成特定的隨機(jī)數(shù)”的反面……
沒錯(cuò),這個(gè)反向思維是“如果我想要一個(gè)所有人都能獲得的特定值,那么給他們一個(gè)算法和種子值就可以了”!
我們不再需要這個(gè)至少13.1萬PB的服務(wù)器用來存儲(chǔ)宇宙了:只要在每臺(tái)機(jī)器上存儲(chǔ)這個(gè)“通過特定種子數(shù)值生成宇宙、行星及星球上一切的算法”,再給幾個(gè)玩家一個(gè)相同的種子值,他們就會(huì)處在一個(gè)同樣的行星系和同樣的星球上。理論上來說,只要把玩家的數(shù)據(jù)再單獨(dú)拆開,我們就能造出一個(gè)龐大的隨機(jī)宇宙,讓無數(shù)的玩家在里面同時(shí)游戲,還不用準(zhǔn)備龐大的服務(wù)器和進(jìn)行預(yù)先設(shè)計(jì)!
如果這個(gè)反向思維成真,只需要給每個(gè)玩家在服務(wù)器端儲(chǔ)存一套用戶數(shù)據(jù),理論上我們就不需要去做單獨(dú)的場(chǎng)景地圖了。我相信,這個(gè)“可以同步的算法”本身,才是無人深空這個(gè)項(xiàng)目最開始的野心和愿景。不需要給大家預(yù)先準(zhǔn)備副本和區(qū)域設(shè)計(jì),只要所有人和服務(wù)器都使用同樣的偽隨機(jī)生成函數(shù)和算法,就能按需生成一個(gè)龐大的可以同時(shí)容納很多玩家的宇宙。
從這點(diǎn)來看,在最初的設(shè)計(jì)方案中,這個(gè)宇宙一定、一定、一定是有多人游戲的。只有非常想做多人游戲的程序員和設(shè)計(jì)師,才會(huì)想出這種充滿炫技色彩的實(shí)現(xiàn)方法,來解決這個(gè)大宇宙沙盤中的對(duì)戰(zhàn)問題。而這個(gè)項(xiàng)目的總監(jiān)、程序員、設(shè)計(jì)師……所有人,甚至包括索尼方面了解這個(gè)項(xiàng)目的宣傳負(fù)責(zé)人,他們也應(yīng)當(dāng)是知道這個(gè)愿景的,所以才會(huì)印出那些包含多人游戲的包裝盒來。所以,他們的項(xiàng)目制作人才會(huì)在各種場(chǎng)合,口無遮攔地暢想著以后“多人模式”實(shí)現(xiàn)后的景象。
然而,最后他們沒做出來,索尼只能臨時(shí)把包裝盒上的“多人游戲”用貼紙給貼上。
要具體將這個(gè)野心變成具體的游戲設(shè)計(jì),非常非常困難,一路上有非常非常多的細(xì)節(jié)問題要處理。某種意義上來說,他們所遇到的問題,有點(diǎn)像我曾經(jīng)討論過的VR游戲設(shè)計(jì):我們有一個(gè)聽起來非常非常棒的點(diǎn)子,但是執(zhí)行起來卻發(fā)現(xiàn)這個(gè)點(diǎn)子的各個(gè)角落,都充滿著我們之前完全沒有想到的問題,每個(gè)問題都足夠毀掉你之前的所有努力。
這些問題里,有些看起來可能是無法解決的;還有一些則是因?yàn)殚_發(fā)團(tuán)隊(duì)的無力和設(shè)計(jì)選擇被迫放棄了;甚至還有一些是因?yàn)殚_發(fā)團(tuán)隊(duì)的不重視和漠視。所以,我們最終沒能看到視頻和宣傳里說的那個(gè)游戲;就算用最寬松的標(biāo)準(zhǔn)評(píng)估,最后實(shí)現(xiàn)的這個(gè)游戲,也只達(dá)到了宣傳和視頻里那個(gè)游戲的30%。
本文內(nèi)容來源于互聯(lián)網(wǎng),如有侵權(quán)請(qǐng)聯(lián)系刪除。

玩家點(diǎn)評(píng) (0人參與,0條評(píng)論)
熱門評(píng)論
全部評(píng)論