做個(gè)幾萬人一起玩的《荒野大鏢客》有可能嗎?
時(shí)間: 2020-09-01 15:09:14 來源: 聚俠網(wǎng) 作者: 聚俠網(wǎng)剝離設(shè)計(jì)和玩法,讓我們從技術(shù)的角度解析這個(gè)問題。
多人游戲的規(guī)模,一直是個(gè)讓人捉摸不透的問題。從 MUD 發(fā)展而來的 MMORPG,同時(shí)在線人數(shù)超過五位數(shù)的并不少見,但到了《方舟:生存進(jìn)化》《ATLAS》和"吃雞類"的作品中,服務(wù)器、或者說一個(gè)房間容納的人數(shù)一般在 70 到 200 之間徘徊。
估計(jì)有不少玩家曾經(jīng)幻想過,將《荒野大鏢客:救贖2》這樣細(xì)致入微的單人體驗(yàn)塑造成大型 MMO,上萬名牛仔在西部世界里快意恩仇、何其壯觀。但即使是技術(shù)力如此之強(qiáng)的 Rockstar,也只敢采取"32 人戰(zhàn)局"的設(shè)計(jì)方式,并在刪減了一些內(nèi)容的情況下推出《荒野大鏢客 Online》。
有時(shí)候,擴(kuò)充多人游戲規(guī)模的瓶頸,還不單單只是愿不愿意花錢買服務(wù)器的問題。拋開設(shè)計(jì)、玩法上的考慮,許多開發(fā)團(tuán)隊(duì)面臨著"想做大卻沒法做大"的技術(shù)窘境?!督^地求生》跟《堡壘之夜》將人數(shù)設(shè)置在 100,也未必全是討個(gè)好彩頭。你要說藍(lán)洞和 Epic 想要致敬高見廣春的小說《大逃殺》,那應(yīng)該也是構(gòu)思 42 人相互廝殺的世界。
巧的是,今年我在 CJ 逛展時(shí)結(jié)識(shí)了田桑。他過去曾在 EA 負(fù)責(zé)線上游戲的功能設(shè)計(jì),后來又任職英礴(Improbable)的游戲解決方案工程師,跟進(jìn)過 5 個(gè) MMO 項(xiàng)目,十分了解多人在線游戲的構(gòu)造。我們從"吃雞"的人數(shù)聊到《荒野大鏢客:救贖2》的多人模式,于是就有了這篇科普。
為什么 MMORPG 能支持上萬人
線上多人游戲的規(guī)模能到今天這個(gè)程度,肯定不是一蹴而就的。1996 年的 MUD《俠客行》最早是在大學(xué)里設(shè)置的服務(wù)器,當(dāng)玩家規(guī)模增長(zhǎng)到 1000 人同時(shí)在線時(shí),其負(fù)載瞬間就被推到了極限。
同時(shí)期圖形化的網(wǎng)游顯得更加"寒磣",由于網(wǎng)絡(luò)游戲的用戶存在多個(gè)狀態(tài),如果說文字 MUD 僅僅是用一句話來描述,那圖形化的狀態(tài)可能要涉及到位置、動(dòng)作、頻率等諸多因素,每秒鐘得同步非常多次,導(dǎo)致數(shù)據(jù)的容量特別大。因此號(hào)稱領(lǐng)先于時(shí)代的《子午線59》,一個(gè)服務(wù)器能夠容納的人數(shù)也只不過 250 人。
當(dāng)然,那個(gè)年代《子午線59》的同屏人數(shù)已經(jīng)足夠震撼了
《網(wǎng)絡(luò)創(chuàng)世紀(jì)》的制作團(tuán)隊(duì)當(dāng)時(shí)沒少為用戶規(guī)模這事操心,在 Alpha 測(cè)試的時(shí)候他們就覺得 250 人離"大型多人互動(dòng)"的概念還有些距離,于是 Beta測(cè)試前是又是買硬件又是研究新技術(shù)。到了 1997 年,這群人在 BUG 一堆的情況下硬是把能夠同時(shí)容納的并發(fā)人數(shù)懟到 3000,導(dǎo)致后來不少漏洞被玩家利用。
在田桑看來,因?yàn)?90 年代是個(gè)快速發(fā)展的時(shí)代,他理解的早期用戶規(guī)模擴(kuò)容偏向堆帶寬和硬件。只不過現(xiàn)在成本的越來越高,采取這種方法的代價(jià)太大,一個(gè)側(cè)面現(xiàn)象就是 CPU 的主頻很多年來沒有太大提升。而從技術(shù)的角度來說,傳統(tǒng) MMORPG 使用的架構(gòu)是 C/S(服務(wù)器-客戶機(jī)),作為一個(gè)被應(yīng)用了 10 多年的架構(gòu),廣泛存在于《Runescape》《魔獸世界》等作品的設(shè)計(jì)中,它可以說是網(wǎng)絡(luò)游戲支持上萬人同時(shí)在線的基礎(chǔ)。
從名字就能看出來,C/S 最早是兩層結(jié)構(gòu),客戶機(jī)也就是玩家電腦(主機(jī))負(fù)責(zé)渲染,服務(wù)器處理游戲邏輯。后來又加了一層"數(shù)據(jù)庫(kù)",搭載了用于保存游戲結(jié)果的存儲(chǔ)器,估計(jì)也不用做太多科普。
一個(gè)典型的 C/S 架構(gòu)交互
為了保證用戶的規(guī)模足夠大,傳統(tǒng) MMORPG 在"保真度"上做了很多犧牲。所謂的保真度可以簡(jiǎn)單理解成游戲的細(xì)致程度,包括物理模擬,比如撞墻之后產(chǎn)生反作用力,或是像《半條命2》那樣實(shí)打?qū)嵉陌压拮游赵谑掷飺炱饋?;也包括延遲和同步,比如動(dòng)作游戲和 FPS 游戲?qū)Ψ?wù)器幀率都有非常高的要求。
根據(jù)田桑的解釋,傳統(tǒng) C/S 的客戶端不做模擬,或者是比較輕量的模擬,它們把這些狀態(tài)以比較低的頻率發(fā)到服務(wù)器,對(duì)服務(wù)器的負(fù)載要求較低,因此就可以允許更多的玩家同時(shí)在線。
《黑色沙漠》在 MMORPG 里的保真度算是不錯(cuò),但相比單人游戲還是差了一截
保真度的差異,我們甚至能從單機(jī)游戲和 MMO 的渲染邏輯中看出來。單機(jī)游戲的圖像會(huì)盡可能從 GPU 中加載,理想狀態(tài)下最好能做到不訪問硬盤和主存?!冻?jí)馬力歐兄弟》每個(gè)關(guān)卡中的方塊、每個(gè)怪物出現(xiàn)的位置都是固定的,角色、敵人和場(chǎng)景在游戲啟動(dòng)時(shí)就渲染讀取完畢,進(jìn)而放到 GPU 內(nèi)存中。
而 MMO 中更多引入了"其它玩家"的變量,加上其技能、特效、位置的無數(shù)種組合,基本無法提前確定要渲染的東西,因此只能動(dòng)態(tài)的從主存和硬盤讀取紋理等數(shù)據(jù)。客戶端與服務(wù)器的交互最先只確定玩家位置,本地先進(jìn)行輪廓渲染,再在保持幀率的前提下一點(diǎn)點(diǎn)把畫面讀出來,體驗(yàn)肯定要差一些。
突然冒出來這么多人,在線多人游戲的圖像具有不可預(yù)測(cè)性
事實(shí)上,在犧牲了保真度的前提下,要保證用戶的規(guī)模夠大,盡可能降低服務(wù)器負(fù)載,C/S 架構(gòu)仍然需要寫一個(gè)極其復(fù)雜的后端。從《魔獸世界》的處理方式不難看出,那個(gè)年代暴雪工程師的天賦何其之高。
最常見的就是"空間分割法",即把游戲中的地理(地圖)進(jìn)行分割,逐一分配給不同的服務(wù)器進(jìn)程或者設(shè)備。
空間分割法
一個(gè)變種是"空間復(fù)制法",即把世界復(fù)制很多份,每份單獨(dú)塞到一個(gè)服務(wù)器;而為了解決玩家因刷寶、挑戰(zhàn)高難度怪物而大量聚集起來的問題,他們又研究出"實(shí)例法",單以副本的方式為每波玩家提供極其有限的地區(qū)。
空間復(fù)制法
因此在田桑的眼中,基于 C/S 的 MMORPG 有著相當(dāng)高的技術(shù)門檻:
"市場(chǎng)喜好拋開不說。MMORPG 的技術(shù)門檻就要比 DS 高。UE 的 DS 我個(gè)人覺得就是一個(gè)非常棒的產(chǎn)品,像做《方舟:生存進(jìn)化》的,還有其它很多工作室,他們沒有多少后端積累,就可以把游戲做到那個(gè)量級(jí)。"
而這里提到的 DS(Dedicated Server,專用服務(wù)器),不僅是當(dāng)下很多主流在線多人游戲都會(huì)使用的技術(shù),也恰好能夠解答"為什么「吃雞」的玩家得是 100 人"的問題(當(dāng)然DS和C/S不是同一類概念)。
為什么一局吃雞的玩家得是 100 人
首先得聲明 100 人只是個(gè)數(shù)量級(jí),并非錙銖必究的數(shù)字。
簡(jiǎn)單來說,DS 可以比喻成"房間制"。好比《絕地求生》《堡壘之夜》《戰(zhàn)地5》和《我的世界》,一個(gè)服務(wù)器(獨(dú)立主機(jī))對(duì)應(yīng)一個(gè)房間,然后這個(gè)房間大致能夠容納兩位數(shù)到三位數(shù)的玩家。
目前市面上主流的游戲引擎,如虛幻和 Unity 為線上多人游戲提供的解決方案都是 DS。這是一種能最大限度提高網(wǎng)游保真度的架構(gòu),它最早的目的就是為了解決 FPS 的同步問題,追求高精度、低延遲,涵蓋客戶端預(yù)測(cè)、服務(wù)器校驗(yàn),延遲補(bǔ)償?shù)榷喾N技術(shù)。
《GTA5》的戰(zhàn)局也是一個(gè) DS
田桑拿虛幻引擎舉了個(gè)例子:"DS 結(jié)構(gòu)下,引擎是帶到服務(wù)器上運(yùn)行的,客戶端渲染相關(guān)的部分被剝離出來了,運(yùn)行的是物理、AI 等純邏輯。由于服務(wù)器能運(yùn)行物理計(jì)算,所以聯(lián)網(wǎng)游戲可以做到物理的同步,就可以實(shí)現(xiàn)很真實(shí)的游戲體驗(yàn)。"
在虛幻引擎的 DS 下,服務(wù)器便承擔(dān)了計(jì)算碰撞同步的任務(wù),例如判定武器有沒有命中,環(huán)境爆炸產(chǎn)生的碎片軌跡這些東西。而且角色的 AI 行為樹同步也依賴 DS,所以服務(wù)器會(huì)高頻率地處理狀態(tài),負(fù)載非常大。這導(dǎo)致 DS 架構(gòu)雖然有著支持高保真度游戲的優(yōu)點(diǎn),同樣也具備高消耗、低承載的缺點(diǎn)。
一個(gè)典型例子是《光環(huán)5》的戰(zhàn)區(qū)模式。這個(gè)用到 DS 架構(gòu)的模式,支持的最大玩家數(shù)是 24 人,而且對(duì)于 AI、載體和目標(biāo)的數(shù)量都有相應(yīng)限制,原因正是要確保不會(huì)超過服務(wù)器的承載量。為此開發(fā)團(tuán)隊(duì)簡(jiǎn)化了 AI 邏輯,因此在戰(zhàn)區(qū)模式下 NPC 會(huì)顯得比戰(zhàn)役中的要"蠢"。
如果延續(xù) C/S 架構(gòu)下的擴(kuò)容思路,玩家們可能會(huì)感到困惑 —— 一臺(tái)服務(wù)器負(fù)載太高,你加幾臺(tái)服務(wù)器不就完事了么?
然而,DS 架構(gòu)在這一點(diǎn)上還受限于游戲引擎:
"虛幻引擎的主要邏輯是單線程運(yùn)行,如果把服務(wù)器的主頻性能,比如從 16 核變成 32 核,能夠負(fù)載的人數(shù)其實(shí)是不能增加的。而且就算從一臺(tái)機(jī)器增加到兩臺(tái)機(jī)器,可容納的玩家數(shù)量也不會(huì)變化,因?yàn)橛幸粋€(gè)技術(shù)架構(gòu)的限制……至于增加核心數(shù)有沒有用,這個(gè)還要看引擎本身是否支持多線程擴(kuò)展。"
Epic 有一段時(shí)間為了《堡壘之夜》能支持 100 人共斗絞盡腦汁,對(duì)虛幻引擎做了不少優(yōu)化。比如在跳傘降落的過程中,主動(dòng)降低遠(yuǎn)程調(diào)用所需要的帶寬;又比如限制客戶端向服務(wù)器發(fā)送移動(dòng)更新的頻率,避免因?yàn)榭蛻舳藥蔬^高,最終導(dǎo)致服務(wù)器過度負(fù)載。
Epic 曾提到過一個(gè)觀點(diǎn),既然一家公司都要做大型 MMO 了,那肯定有自己獨(dú)特的要求和后端解決方案,依樣畫葫蘆地照搬他們的 DS 不太適合,虛幻本身去研究擴(kuò)容的事情可能會(huì)比較雞肋,鼓勵(lì)開發(fā)者基于這項(xiàng)技術(shù)自己想辦法。
而主要邏輯是單線程運(yùn)行的 Unity,其實(shí)或多或少也和虛幻引擎一樣需要面臨同樣的問題。
做個(gè)幾萬人的《荒野大鏢客》有沒有可能
從上面兩個(gè)部分的論述來看,不難發(fā)現(xiàn)如今線上多人游戲面臨一個(gè)兩難的局面。要么就沿用傳統(tǒng) C/S,自己寫后端,以降低保真度為代價(jià)追求規(guī)模;要么就拿 DS 架構(gòu)辦事,縮小規(guī)模,提高保真度。
但有沒有辦法將它們?nèi)诤掀饋砟??其?shí)很多開發(fā)團(tuán)隊(duì)都在思考這個(gè)問題。
市面上有著這樣特性的產(chǎn)品不多,"褒貶不一"的海盜冒險(xiǎn)多人游戲《ATLAS》勉強(qiáng)算一個(gè)。拋開產(chǎn)品品質(zhì)的問題,《ATLAS》用的就是 DS 架構(gòu),而且"理論上"支持 40000 名玩家同時(shí)游玩。
《ATLAS》
他們的做法,是在 DS 外自己寫了世界服務(wù)器和數(shù)據(jù)服務(wù)器的后端。先把多個(gè) DS 實(shí)例給拼起來,再由世界服務(wù)器統(tǒng)一負(fù)責(zé)管理 —— 比如只要玩家過地圖,就把玩家的數(shù)據(jù)搬到另一臺(tái)服務(wù)器。其實(shí)可以類比成《魔獸世界》的"空間分割法",當(dāng)然明顯能夠看出技術(shù)不怎么成熟,Steam 上負(fù)面評(píng)價(jià)最多的地方就是"卡"和"連不上"。
英礴本來也打算打造一個(gè)龐大的、高保真度的游戲世界,結(jié)果發(fā)現(xiàn)技術(shù)方面都是坑。于是干脆先把 DS 的問題捋清,降低日后游戲制作的門檻和風(fēng)險(xiǎn),因此催生出了一個(gè)解決方案(工具):SpatialOS。
SpatialOS 是一個(gè)基于底層公有云資源的游戲開發(fā)環(huán)境。它一方面會(huì)給你提供云端的服務(wù)器托管,一方面給予技術(shù)支持,類似于一個(gè)多功能插件。這個(gè)工具可以很簡(jiǎn)單的接入虛幻和 Unity 引擎,甚至任何其他第三方引擎,它主要提供在 DS 架構(gòu)下擴(kuò)充多人游戲規(guī)模的手段。
其中一個(gè)擴(kuò)容思路和《ATLAS》有點(diǎn)像,如果一個(gè) DS 不夠用,就把多個(gè) DS 拼接起來統(tǒng)一管控。因?yàn)?SpatialOS 虛幻開發(fā)套件的方向就是走多進(jìn)程,這樣更容易利用多核甚至多機(jī)器的計(jì)算資源,可以突破傳統(tǒng) DS 的限制 —— 簡(jiǎn)而言之就是給游戲加服務(wù)器有用了。
上面這段話有點(diǎn)繞,直接看"把 DS 拼起來"的示例圖更加直觀。下圖中 9 個(gè)方塊代表 9 個(gè) DS,每個(gè)游戲服務(wù)器的管轄區(qū)域分別由不同顏色代表,玩家不僅可以無縫跨越服務(wù)器邊界,也能和不同區(qū)域的其它玩家互動(dòng)。
據(jù)田桑解釋,這背后的秘密是 9 個(gè) DS 之上有一個(gè)"網(wǎng)絡(luò)層",它才真正負(fù)責(zé)所有游戲狀態(tài)的管理。一個(gè) DS 是一個(gè)區(qū),通過這個(gè)管理層將所有區(qū)彌合起來??蛻舳诉B到這個(gè)管理層,而不是所有的 DS 之上。
利用多個(gè)游戲服務(wù)器來模擬游戲世界的不同區(qū)域
說到分層這個(gè)概念,SpatialOS 中還有項(xiàng)名為"AI 負(fù)載拆分"的功能,正好能解決前文《光環(huán)5》戰(zhàn)區(qū)模式的問題。理論是,如果把 AI 的負(fù)載扔到另一個(gè)服務(wù)器,那不就為玩家擴(kuò)容騰出空間了嗎,而且還不必讓 NPC 變"蠢",可謂一舉兩得。
這種方法可以采取的應(yīng)用很廣,對(duì)延遲要求不高,和核心系統(tǒng)(如物理)耦合度不高的東西都可以拆分出來,比如天氣系統(tǒng)。分出來的層,則基于云放到另一臺(tái)虛擬機(jī)上。
英礴本身做了一些實(shí)驗(yàn),使用原生虛幻引擎的情況下,在已有 100 名玩家的基礎(chǔ)上最多可以運(yùn)行 229 個(gè) AI;而將 AI 負(fù)載扔到另一個(gè)服務(wù)器后,維持相同服務(wù)器幀率的前提下 AI 數(shù)量可以達(dá)到 479 個(gè),相當(dāng)于擴(kuò)容了一倍。
目前正在測(cè)試的冒險(xiǎn)生存游戲《拾荒者》(Scavengers),剛好就采用了 AI 負(fù)載拆分的技術(shù)。開發(fā)商 Midwinter Entertainment 表示玩家會(huì)在游戲中遭遇極端天氣、怪物肆虐,外來入侵者以及敵對(duì)玩家團(tuán)隊(duì)等各方面的威脅。而 AI 負(fù)載拆分使得他們?cè)?3x3 公里的地圖內(nèi),一方面保證了這些高保真度的體驗(yàn),一方面又實(shí)現(xiàn)了"60 名玩家+300 個(gè) AI"的規(guī)模。
當(dāng)然,盡管分層看起來很牛逼,但銀彈卻是不存在的,田桑舉了個(gè)例子:
"假設(shè) A1 區(qū)域有 10000 人,負(fù)載不下了。那要么把 A1 切成 A1 和 A2,分別放 5000 人,也可能是在 A1 上面再加一層,這都是開發(fā)者自己去控制的。但是這個(gè)事情會(huì)帶來成本,因?yàn)閮蓚€(gè)區(qū)間之間有大量通信,要靠服務(wù)器硬件來堆。
比如一個(gè)服務(wù)器要從 1000 人擴(kuò)容到 3000 人,那就分三層……如果每層額外帶來的性能損耗是 50%,每一層實(shí)際只能跑 500 人,三層只有 1500 人。那你又得多分幾層,這時(shí)候的損耗可能又不止 50% 了。"
所以,要想在 DS 架構(gòu)下把玩家的規(guī)模擴(kuò)大,得綜合多種方法。SpatialOS 實(shí)際上還有一套名為 QBI 的系統(tǒng),可以自定義降低同步頻率,解決一些網(wǎng)絡(luò)負(fù)載的問題。比如其中一個(gè)表現(xiàn)就是令距離玩家較近的活動(dòng)物體看起來更順暢,越遠(yuǎn)"越卡",主要是看開發(fā)者如何發(fā)揮想象。
正如之前提到的技術(shù)限制,MMORPG 人數(shù)規(guī)模很大,可以達(dá)到幾千上萬人,但基本集中在社交、打怪,或者是副本的交互方式,很少見到有真實(shí)的物理模擬。另外一個(gè)方向是像《堡壘之夜》《方舟:生存進(jìn)化》這樣的游戲,它們有些地方做得很細(xì)致,但人數(shù)又容易碰到瓶頸,通常就是房間制的。
由此引申到能不能做"容納幾萬人的《荒野大鏢客:救贖2》"的問題,田桑認(rèn)為理論上是可行的,只是還沒有開發(fā)者觸及到這根線。而且即使解決了技術(shù)問題后,話題就又回到了無法回避的開發(fā)風(fēng)險(xiǎn)和成本。
不過,未來這兩種需求應(yīng)該會(huì)交匯到一起,使得線上多人游戲在現(xiàn)今的標(biāo)準(zhǔn)上再進(jìn)一步:一方面能支持更多玩家,一方面又能保證更真實(shí)的模擬。至少有人目前正在朝著這個(gè)方向努力,或許再過不久,有著高保真度的大型多人在線游戲就不再僅僅停留在幻想中。