網(wǎng)絡(luò)游戲(Online?Game),又稱“在線游戲”,簡(jiǎn)稱“網(wǎng)絡(luò)游戲”,它是指以網(wǎng)絡(luò)為傳輸媒介、以游戲運(yùn)營(yíng)商服務(wù)器和用戶計(jì)算機(jī)為處理終端、以游戲客戶端軟件為信息交互窗口的旨在實(shí)現(xiàn)娛樂(lè)、休閑、交流和取得虛擬成就的具有相當(dāng)可持續(xù)性的個(gè)體性多人在線游戲。
網(wǎng)絡(luò)游戲英文為Online?Game,簡(jiǎn)稱網(wǎng)游。又稱?“在線游戲”。必須依托于互聯(lián)網(wǎng)進(jìn)行、可以多人同時(shí)參與的游戲,通過(guò)人與人之間的互動(dòng)達(dá)到交流、娛樂(lè)和休閑的目的。
按游戲產(chǎn)品的不同,網(wǎng)絡(luò)游戲可分為大型角色扮演類網(wǎng)絡(luò)游戲、休閑游戲、網(wǎng)頁(yè)游戲以及手機(jī)游戲。
據(jù)《中國(guó)網(wǎng)絡(luò)游戲行業(yè)商業(yè)模式創(chuàng)新與投資預(yù)測(cè)分析報(bào)告前瞻》統(tǒng)計(jì)數(shù)據(jù)顯示,截止2011年12月份,全國(guó)上網(wǎng)用戶5.13億,占人口比例38.3%;網(wǎng)絡(luò)游戲用戶3.24億,占網(wǎng)民比例63.2%。
在網(wǎng)絡(luò)游戲用戶中,互聯(lián)網(wǎng)游戲用戶2011年的總數(shù)突破1.6億人,同比增長(zhǎng)33%;其中,網(wǎng)頁(yè)游戲用戶持續(xù)增長(zhǎng),規(guī)模為1.45億人,增長(zhǎng)率達(dá)24%。移動(dòng)網(wǎng)下載單機(jī)游戲用戶超過(guò)5100萬(wàn)人,增長(zhǎng)率達(dá)46%;移動(dòng)網(wǎng)在線游戲用戶數(shù)量達(dá)1130萬(wàn)人,增長(zhǎng)率達(dá)352%。相對(duì)于互聯(lián)網(wǎng)游戲用戶數(shù)量增長(zhǎng)速度的放緩,移動(dòng)網(wǎng)游戲用戶數(shù)量出現(xiàn)了高速的增長(zhǎng),這表明移動(dòng)互聯(lián)網(wǎng)正逐漸成為網(wǎng)絡(luò)游戲市場(chǎng)迅速增長(zhǎng)的力量。
網(wǎng)游從早先的一種免費(fèi)PC游戲形式,經(jīng)過(guò)若干年的發(fā)展,時(shí)至今日已成長(zhǎng)為一個(gè)相當(dāng)成熟而龐大的游戲產(chǎn)業(yè)。
單從中文字面上理解,任何有聯(lián)網(wǎng)功能的游戲,似乎都稱得上是網(wǎng)絡(luò)游戲,而實(shí)際上網(wǎng)游的概念相對(duì)要狹窄一些,換句話說(shuō)更貼近Online Game的本意,只有完全依靠在線形式、不具備單機(jī)游戲功能的游戲才算是真正的網(wǎng)游。
一、第一代網(wǎng)絡(luò)游戲:1969年至1977年
背景:由于當(dāng)時(shí)的計(jì)算機(jī)硬件和軟件尚無(wú)統(tǒng)一的技術(shù)標(biāo)準(zhǔn),因此第一代網(wǎng)絡(luò)游戲的平臺(tái)、操作系統(tǒng)和語(yǔ)言各不相同。它們大多為試驗(yàn)品,運(yùn)行在高等院校的大型主機(jī)上,如美國(guó)的麻省理工學(xué)院、弗吉尼亞大學(xué),以及英國(guó)的埃塞克斯大學(xué)。
游戲特征:1、非持續(xù)性,機(jī)器重啟后游戲的相關(guān)信息即會(huì)丟失,因此無(wú)法模擬一個(gè)持續(xù)發(fā)展的世界;2、游戲只能在同一服務(wù)器/終端機(jī)系統(tǒng)內(nèi)部執(zhí)行,無(wú)法跨系統(tǒng)運(yùn)行。
商業(yè)模式:免費(fèi)。
第一款真正意義上的網(wǎng)絡(luò)游戲可追溯到1969年,當(dāng)時(shí)瑞克·布羅米為PLATO(Programmed Logic for Automatic Teaching Operations)系統(tǒng)編寫(xiě)了一款名為《太空大戰(zhàn)》(SpaceWar)的游戲,游戲以八年前誕生于麻省理工學(xué)院的第一款電腦游戲《太空大戰(zhàn)》為藍(lán)本,不同之處在于,它可支持兩人遠(yuǎn)程連線。
PLATO是歷史上最為悠久也是最著名的一套遠(yuǎn)程教學(xué)系統(tǒng),由美國(guó)伊利諾斯州厄本姆的伊利諾斯大學(xué)開(kāi)發(fā)于上世紀(jì)60年代末,其主要功用是為不同教育程度的學(xué)生提供高質(zhì)量的遠(yuǎn)程教育,它具有龐大的課程程序庫(kù),可同時(shí)開(kāi)設(shè)數(shù)百門(mén)課,可以記錄下每一位學(xué)生的學(xué)習(xí)進(jìn)度。PLATO還是第一套分時(shí)共享系統(tǒng),它運(yùn)行于一臺(tái)大型主機(jī)而非微型計(jì)算機(jī)上,因此具有更強(qiáng)的處理能力和存儲(chǔ)能力,這使得它所能支持的同時(shí)在線人數(shù)大大增加。1972年,PLATO的同時(shí)在線人數(shù)已達(dá)到1000多名。
那些年里,PLATO平臺(tái)上出現(xiàn)了各種不同類型的游戲,其中一小部分是供學(xué)生自?shī)首詷?lè)的單機(jī)游戲,而最為流行的則是可在多臺(tái)遠(yuǎn)程終端機(jī)之間進(jìn)行的聯(lián)機(jī)游戲,這些聯(lián)機(jī)游戲即是網(wǎng)絡(luò)游戲的雛形。盡管游戲只是PLATO的附屬功能,但共享內(nèi)存區(qū)、標(biāo)準(zhǔn)化終端、高端圖像處理能力和中央處理能力、迅速的反應(yīng)能力等特點(diǎn)令PLATO能夠出色地支持網(wǎng)絡(luò)游戲的運(yùn)行,因此在隨后的幾年內(nèi),PLATO成了早期網(wǎng)絡(luò)游戲的溫床。
PLATO系統(tǒng)上最流行的游戲是《圣者》(Avatar)和《帝國(guó)》(Empire),前者是一款“龍與地下城”設(shè)定的網(wǎng)絡(luò)游戲,后者是一款以“星際迷航”為背景的網(wǎng)絡(luò)游戲。這些游戲絕大多數(shù)是程序員利用業(yè)余時(shí)間編寫(xiě)并免費(fèi)發(fā)布的,他們只是希望自己的游戲能獲得大家的認(rèn)可。當(dāng)然,也有一些開(kāi)發(fā)者通過(guò)自己的游戲獲得了收入,但通常每小時(shí)只有幾美分,并且還得在若干作者之間進(jìn)行分配。
PLATO在游戲圈內(nèi)并未獲得其應(yīng)有的榮譽(yù)和地位,但這并不能抹殺它對(duì)網(wǎng)絡(luò)游戲以及整個(gè)游戲產(chǎn)業(yè)所做出的貢獻(xiàn)。PLATO上的不少游戲日后都被改編為了游戲機(jī)游戲和PC游戲,例如《空中纏斗》(Airfight)的作者在原游戲的基礎(chǔ)上開(kāi)發(fā)了《飛行模擬》(Flight Simulator),80年代初,這款游戲被微軟收購(gòu)并改名為《微軟飛行模擬》,成為飛行模擬類游戲中最暢銷(xiāo)的一個(gè)系列。1974年推出的《帝國(guó)》是第一款允許32人同時(shí)在線的游戲,這一聯(lián)機(jī)游戲模式成為現(xiàn)代即時(shí)策略游戲的標(biāo)準(zhǔn)模式。1975年發(fā)布的《奧布里特》(oubliette)是一款地牢類游戲,大名鼎鼎的角色扮演游戲《巫術(shù)》(Wizardry)系列即源于此。
有趣的是,1969年也正是ARPAnet(Advance Research Projects Agency Network)誕生的年份。大家知道,ARPAnet是美國(guó)國(guó)防部高級(jí)研究計(jì)劃署研制的世界上首個(gè)包交換網(wǎng)絡(luò),它的成功直接促成了互聯(lián)網(wǎng)以及傳輸控制協(xié)議(即TCP/IP)的誕生。
二、第二代網(wǎng)絡(luò)游戲:1978年至1995年
背景:一些專業(yè)的游戲開(kāi)發(fā)商和發(fā)行商開(kāi)始涉足網(wǎng)絡(luò)游戲,如Activision、Interplay、Sierra Online、Stormfront Studios、Virgin Interactive、SSI和TSR等,都曾在這一階段試探性地進(jìn)入過(guò)這一新興產(chǎn)業(yè),它們與GEnie、Prodigy、AOL和CompuServe等運(yùn)營(yíng)商合作,推出了第一批具有普及意義的網(wǎng)絡(luò)游戲。
游戲特征:1、網(wǎng)絡(luò)游戲出現(xiàn)了“可持續(xù)性”的概念,玩家所扮演的角色可以成年累月地在同一世界內(nèi)不斷發(fā)展,而不像PLATO上的游戲那樣,只能在其中扮演一個(gè)匆匆過(guò)客。2、游戲可以跨系統(tǒng)運(yùn)行,只要玩家擁有電腦和調(diào)制解調(diào)器,且硬件兼容,就能連入當(dāng)時(shí)的任何一款網(wǎng)絡(luò)游戲。
商業(yè)模式:網(wǎng)絡(luò)游戲市場(chǎng)的迅速膨脹刺激了網(wǎng)絡(luò)服務(wù)業(yè)的發(fā)展,網(wǎng)絡(luò)游戲開(kāi)始進(jìn)入收費(fèi)時(shí)代,許多消費(fèi)者都愿意支付高昂的費(fèi)用來(lái)玩網(wǎng)絡(luò)游戲。從《凱斯邁之島》的每小時(shí)12美元到GEnie的每小時(shí)6美元,第二代網(wǎng)絡(luò)游戲的主流計(jì)費(fèi)方式是按小時(shí)計(jì)費(fèi),盡管也有過(guò)包月計(jì)費(fèi)的特例,但未能形成氣候。
1978年在英國(guó)的埃塞克斯大學(xué),羅伊·特魯布肖用DEC-10編寫(xiě)了世界上第一款MUD游戲——“MUD1”,這是一個(gè)純文字的多人世界,擁有20個(gè)相互連接的房間和10條指令,用戶登錄后可以通過(guò)數(shù)據(jù)庫(kù)進(jìn)行人機(jī)交互,或通過(guò)聊天系統(tǒng)與其他玩家交流。
特魯布肖離開(kāi)埃塞克斯大學(xué)后,把維護(hù)MUD1的工作轉(zhuǎn)交給了理查德·巴特爾,巴特爾利用特魯布肖開(kāi)發(fā)的MUD專用語(yǔ)言——“MUDDL”繼續(xù)改進(jìn)游戲,他把房間的數(shù)量增加到400個(gè),進(jìn)一步完善了數(shù)據(jù)庫(kù)和聊天系統(tǒng),增加了更多的任務(wù),并為每一位玩家制作了計(jì)分程序。
1980年埃塞克斯大學(xué)與ARPAnet相連后,來(lái)自國(guó)外的玩家大幅增加,吞噬了大量系統(tǒng)資源,致使校方不得不限制用戶的登錄時(shí)間,以減少DEC-10的負(fù)荷。80年代初,巴特爾出于共享和交流的目的,把MUD1的源代碼和盤(pán)托出供同事及其它大學(xué)的研究人員參考,于是這套源代碼就被流傳了出去。到1983年末,ARPAnet上已經(jīng)出現(xiàn)了數(shù)百份非法拷貝,MUD1在全球各地迅速流傳開(kāi)來(lái),并出現(xiàn)了許多新的版本。如今,這套最古老的MUD系統(tǒng)已被授權(quán)給美國(guó)最大的在線信息服務(wù)機(jī)構(gòu)之一——CompuServe公司,易名為“不列顛傳奇”,至今仍在運(yùn)行之中,成為運(yùn)作時(shí)間最長(zhǎng)的MUD系統(tǒng)。
MUD1是第一款真正意義上的實(shí)時(shí)多人交互網(wǎng)絡(luò)游戲,它可以保證整個(gè)虛擬世界的持續(xù)發(fā)展。盡管這套系統(tǒng)每天都會(huì)重啟若干次,但重啟后游戲中的場(chǎng)景、怪物和謎題仍保持不變,這使得玩家所扮演的角色可以獲得持續(xù)的發(fā)展。MUD1的另一重要特征是,它可以在全世界任何一臺(tái)PDP-10計(jì)算機(jī)上運(yùn)行,而不局限于埃塞克斯大學(xué)的內(nèi)部系統(tǒng)。
1982年,約翰·泰勒和凱爾頓·弗林組建Kesmai公司,這家公司在網(wǎng)絡(luò)游戲的發(fā)展史上留下了不少具有紀(jì)念意義的作品。Kesmai公司的第一份合約是與CompuServe簽訂的,當(dāng)時(shí)約翰·泰勒看見(jiàn)了CompuServe打出的一則名為“太空戰(zhàn)士”(MegaWars)的廣告——“如果你能編寫(xiě)一款這樣的游戲,你就能獲得每月3萬(wàn)美元的版稅金”,他便把同凱爾頓·弗林一起開(kāi)發(fā)的《凱斯邁之島》(The Island of Kesmai)的使用手冊(cè)寄了一份給當(dāng)時(shí)在CompuServe負(fù)責(zé)游戲業(yè)務(wù)的比爾·洛登,洛登對(duì)此很感興趣?!秳P斯邁之島》的運(yùn)行平臺(tái)為UNIX系統(tǒng),而CompuServe使用的是DEC-20計(jì)算機(jī),于是Kesmai公司重新為CompuServe開(kāi)發(fā)了一個(gè)DEC-20的版本。這款游戲運(yùn)營(yíng)了大約13年,1984年開(kāi)始正式收費(fèi),收費(fèi)標(biāo)準(zhǔn)為每小時(shí)12美元。同年,MUD1也在英國(guó)的Compunet上推出了第一個(gè)商業(yè)版本。
1984年,馬克·雅克布Mythic娛樂(lè)公司的前身),并推出游戲《阿拉達(dá)特》(Aradath)。雅克布斯在自己家里搭建了一個(gè)服務(wù)器平臺(tái),安裝了8條電話線以運(yùn)行這款文字角色扮演游戲,游戲的收費(fèi)標(biāo)準(zhǔn)為每月40美元,這是網(wǎng)絡(luò)游戲史上第一款采用包月制的網(wǎng)絡(luò)游戲,包月制的收費(fèi)方式有利于加速網(wǎng)絡(luò)游戲的平民化進(jìn)程,對(duì)網(wǎng)絡(luò)游戲的普及將起到重要作用。遺憾的是,包月制在當(dāng)時(shí)并沒(méi)有成長(zhǎng)起來(lái)的條件,1990年AUSI公司為《龍門(mén)》(Dragon’s Gate)定的價(jià)格為每小時(shí)20美元,盡管費(fèi)率高得驚人,但仍有人愿意每月花上2000多美元去玩這款游戲,因此在80年代末90年代初,包月制并未引起人們的關(guān)注。
1985年,比爾·洛登說(shuō)服通用電氣公司(GE)的信息服務(wù)部門(mén)投資建立了一個(gè)類似CompuServe的、商業(yè)化的、基于ASCII文本的網(wǎng)絡(luò)服務(wù)平臺(tái),這套平臺(tái)被稱為GEnie(GE Network for Information Exchange)。GEnie于10月份正式啟動(dòng),其低廉的收費(fèi)標(biāo)準(zhǔn)在用戶中間引起了巨大反響,也令一向有著強(qiáng)烈優(yōu)越感的CompuServe感受到了競(jìng)爭(zhēng)的壓力。GEnie系統(tǒng)實(shí)際上是利用GE信息服務(wù)部門(mén)的服務(wù)器在夜晚的空閑時(shí)間為用戶提供服務(wù),因此收費(fèi)非常低廉,晚上的價(jià)格約為每小時(shí)6美元,幾乎是CompuServe的一半。
同年11月,Quantum Computer Services(AOL的前身)毫無(wú)聲息地推出了QuantumLink平臺(tái),這是一個(gè)專為Commandore 64/128游戲機(jī)玩家服務(wù)的圖形網(wǎng)絡(luò)平臺(tái),費(fèi)率僅為每月9.95美元。這一收費(fèi)標(biāo)準(zhǔn)完全可以成為網(wǎng)絡(luò)游戲發(fā)展史上的一個(gè)重要里程碑,但由于當(dāng)時(shí)的Commandore 64/128游戲機(jī)已步入衰退期,因此這項(xiàng)具有革命意義的收費(fèi)標(biāo)準(zhǔn)如同雅克布斯的“家庭作坊”一樣,未能引起人們的重視,否則網(wǎng)絡(luò)游戲的革命很可能會(huì)提前來(lái)到。
無(wú)論如何,更多運(yùn)營(yíng)商的介入令網(wǎng)絡(luò)服務(wù)業(yè)的競(jìng)爭(zhēng)激烈了起來(lái),費(fèi)率的下調(diào)已成必然趨勢(shì)。這一階段的美國(guó)網(wǎng)絡(luò)游戲業(yè)如同現(xiàn)階段國(guó)內(nèi)的網(wǎng)絡(luò)游戲業(yè),運(yùn)營(yíng)商與游戲商在網(wǎng)絡(luò)游戲身上大賺了一筆。1988年,Quantum從TSR手中購(gòu)得“龍與地下城”的授權(quán),三年后,第一款A(yù)D&D設(shè)定的網(wǎng)絡(luò)游戲——《夜在絕冬城》(Neverwinter Nights)誕生,這款游戲運(yùn)營(yíng)了若干年,盡管所采用的圖像技術(shù)陳舊不堪,但僅在它生命周期的最后一年,即1996年,它就為AOL帶來(lái)了500萬(wàn)美元的收益。
相比于我們常見(jiàn)的數(shù)據(jù)中心的普通web服務(wù)器,游戲服務(wù)器(如英雄聯(lián)盟,魔獸世界)有什么特別的地方?
朋友里有一位服務(wù)器大牛做過(guò)類似的總結(jié),我征得他的同意把當(dāng)時(shí)的資料分享一下。大量刪節(jié)。
文章里說(shuō)游戲服務(wù)器比較多,沒(méi)怎么說(shuō)web服務(wù)器。但是看了之后你就明白Web和游戲服務(wù)器在并發(fā)性方面根本性的不同了。
· 前言
· 我們將從游戲服務(wù)器發(fā)展的簡(jiǎn)單歷程出發(fā),鳥(niǎo)瞰一下目前大多數(shù)的游戲服務(wù)器架構(gòu)。
· 這里盡可能的避免陷入細(xì)節(jié)的技術(shù)問(wèn)題,而是從技術(shù)進(jìn)化的結(jié)果狀態(tài),反推原始問(wèn)題是什么。希望能通過(guò)這個(gè)過(guò)程,解釋清楚游戲服務(wù)器是在解決什么問(wèn)題,痛點(diǎn)到底在哪里。
· 一、早期網(wǎng)游服務(wù)器。
· 蠻荒時(shí)期的游戲服務(wù)器框架我們一筆帶過(guò),那時(shí)的游戲服務(wù)器和一個(gè)小Web服務(wù)沒(méi)有區(qū)別。
· 蠻荒時(shí)代的服務(wù)器只負(fù)責(zé)存儲(chǔ)玩家賬號(hào)、數(shù)據(jù)、轉(zhuǎn)發(fā)場(chǎng)景內(nèi)其他玩家的行為。很多移動(dòng)、使用技能等關(guān)鍵邏輯在服務(wù)器上根本沒(méi)有。隨意就能用變速齒輪改變游戲速度。
· 從傳奇的時(shí)代開(kāi)始,游戲服務(wù)器就不再是簡(jiǎn)單的上傳存檔、下載存檔、訪問(wèn)頁(yè)面而已。游戲服務(wù)器內(nèi)部出現(xiàn)了游戲邏輯,既能用于同步每個(gè)玩家看到的世界,又能讓邏輯與客戶端分離,避免早期的網(wǎng)絡(luò)游戲那種毫無(wú)防范的邏輯體系(對(duì)外掛防御能力為0)。
· 這種架構(gòu)奇怪的地方是處理網(wǎng)絡(luò)連接數(shù)據(jù)傳輸?shù)膲毫瓦壿嬏幚淼膲毫υ谕粋€(gè)服務(wù)器上(存儲(chǔ)模塊可能也在同一個(gè)進(jìn)程),就算邏輯處理壓力為0,承載人數(shù)也高不到哪去。
· 二、早期游戲服務(wù)器的改進(jìn)版本
· 當(dāng)開(kāi)發(fā)者們有了初步經(jīng)驗(yàn)以后,新作品的開(kāi)發(fā),自然而然的過(guò)渡到了如下的形式:
· 游戲邏輯服務(wù)依然是在一臺(tái)服務(wù)器上,單進(jìn)程(邏輯處理本身肯定是在一個(gè)線程中,可以有子線程負(fù)責(zé)內(nèi)網(wǎng)通信)。但是我們自然的想到,存儲(chǔ)負(fù)載和網(wǎng)絡(luò)連接負(fù)載可以從邏輯服上拆出來(lái)。
· 由于連接服務(wù)器本身沒(méi)有時(shí)序性,很容易做分布式的(其實(shí)大部分游戲還是只用一個(gè)連接服),存儲(chǔ)服務(wù)不要求高實(shí)時(shí)性,高峰期存盤(pán)間隔可以稍長(zhǎng)一些,不會(huì)對(duì)游戲服造成影響。
· 三、成熟形態(tài)的服務(wù)器框架(這節(jié)是重點(diǎn))
· 1、邏輯服務(wù)器的負(fù)載均攤方法一:按照功能劃分多個(gè)服務(wù)器進(jìn)程
· 2、邏輯服務(wù)器的負(fù)載均攤方法二:按照?qǐng)鼍皠澐侄鄠€(gè)服務(wù)器進(jìn)程
· 難點(diǎn)在邏輯的設(shè)計(jì)上,要像做手術(shù)一樣把本來(lái)是一體的功能切開(kāi),并抽象出若干個(gè)API來(lái)保持聯(lián)系(服務(wù)器之間是TCP連接)。
· 在分解時(shí),要找聯(lián)系相對(duì)最薄弱的環(huán)節(jié)入手,比如場(chǎng)景和場(chǎng)景之間分開(kāi)、單獨(dú)抽出聊天服務(wù)、組隊(duì)服務(wù)、好友服務(wù)。
· 無(wú)論如何分解,最終結(jié)果只能是有限個(gè)服務(wù)。而且分解的越細(xì),開(kāi)發(fā)難度就越大。因?yàn)榭绶?wù)器邏輯是把簡(jiǎn)單的同步邏輯變成了異步Callback邏輯,而且容易出現(xiàn)時(shí)序問(wèn)題等不易測(cè)試的問(wèn)題。
· 單個(gè)場(chǎng)景服務(wù)幾乎是無(wú)法分解的。分解單個(gè)場(chǎng)景難度巨大以至于出現(xiàn)了BigWorld引擎來(lái)專門(mén)的解決場(chǎng)景分割問(wèn)題,后面會(huì)談到。
· 這種成熟形態(tài)的游戲服務(wù)器已經(jīng)能滿足現(xiàn)實(shí)中99%的頻繁交互類網(wǎng)游需求,是大型MMO端游、頁(yè)游的主流形式。
· 對(duì)比Web服務(wù)器
大致只說(shuō)一點(diǎn):由于數(shù)據(jù)庫(kù)的存在以及HTTP請(qǐng)求的特性,Web服務(wù)器天生就是并發(fā)的,也一直在高并發(fā)的路上越走越遠(yuǎn)。
· 附:開(kāi)房間式的網(wǎng)絡(luò)游戲
· 開(kāi)房間式的網(wǎng)絡(luò)游戲也是游戲的一個(gè)重要分支,英雄聯(lián)盟、DOTA、很多手游例如皇室戰(zhàn)爭(zhēng)、王者榮耀等等。
· 這種游戲房間之間幾乎沒(méi)有交互,只有大廳內(nèi)有交互,可以理解為原始形態(tài)的游戲服務(wù)器的平行擴(kuò)展。
· 房間式游戲擴(kuò)展難度較小,只是需要根據(jù)玩家數(shù)量動(dòng)態(tài)擴(kuò)展游戲房間的數(shù)量、服務(wù)器數(shù)量。很像網(wǎng)站的架構(gòu)。
· 這種游戲架構(gòu)最最適合放在云平臺(tái)上,設(shè)計(jì)合理的話,它可能遇到的問(wèn)題和大型網(wǎng)站幾乎一模一樣。不需要特別的討論它們。
· 只是,畢竟游戲不都是開(kāi)房間的玩法。
· 1、真正的數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)庫(kù)性能不那么重要
· 注:很多大型游戲采用了共享內(nèi)存,避免宕機(jī)時(shí)損失過(guò)大。
· 2、單CPU性能比CPU數(shù)量重要的多。
· 3、目前有很多游戲,特別是手游,使用Redis讀寫(xiě)代替內(nèi)存讀寫(xiě),甚至也有用Mongo的。
· 4、開(kāi)新服、舊區(qū)合服的情況,非常適合云平臺(tái)。
· 先進(jìn)服務(wù)器框架
1、BigWorld。理念過(guò)于超前,把并發(fā)性做到極致,開(kāi)發(fā)友好度弱到極致,已廢。
2、Skynet。本人強(qiáng)烈推薦,誰(shuí)學(xué)誰(shuí)知道,除了必須要用lua語(yǔ)言,沒(méi)有什么缺點(diǎn)。
· 聊聊十萬(wàn)行代碼
· 游戲服務(wù)器開(kāi)發(fā)速度受美術(shù)資源制作速度、客戶端開(kāi)發(fā)速度制約。近幾年我猜測(cè)服務(wù)器方面并不會(huì)有大的技術(shù)革新。
· 游戲開(kāi)發(fā)未來(lái)的趨勢(shì)是多元化、低門(mén)檻化、大眾化。很長(zhǎng)一段時(shí)間內(nèi)BigWorld這種大怪獸級(jí)別的引擎不會(huì)再崛起。
· 分布式框架的崛起時(shí)間點(diǎn),無(wú)論如何,也在VR技術(shù)成熟之后了。
數(shù)據(jù)庫(kù)服務(wù)器
數(shù)據(jù)庫(kù)服務(wù)器其實(shí)就是專門(mén)利用一臺(tái)服務(wù)器進(jìn)行數(shù)據(jù)庫(kù)的讀寫(xiě)操作。這點(diǎn)特別是在大型的網(wǎng)絡(luò)游戲里尤為重要。因?yàn)樵诖笮途W(wǎng)絡(luò)游戲里,要處理玩家的數(shù)據(jù)量非常大,如果不利用專門(mén)的服務(wù)器進(jìn)行處理,很有可能會(huì)拖累這個(gè)服務(wù)器組。
計(jì)費(fèi)服務(wù)器
通常在商業(yè)的網(wǎng)絡(luò)游戲里出現(xiàn),用于記錄玩家在線的時(shí)間,給收費(fèi)提供依據(jù),同時(shí)也是整個(gè)服務(wù)器組里最重要的部分,一旦出現(xiàn)問(wèn)題,運(yùn)營(yíng)商就不用賺錢(qián)了。
聊天服務(wù)器
在游戲里的聊天功能是屬于一種瞬時(shí)動(dòng)作,理論上是放在邏輯服務(wù)器里進(jìn)行處理。不過(guò)在大型網(wǎng)絡(luò)游戲里,因?yàn)檫@個(gè)部分功能與游戲里的其它部分聯(lián)系并不緊密,因此可以獨(dú)立出來(lái)做一個(gè)功能服務(wù)器。
服務(wù)器的集群設(shè)置
在大型游戲的應(yīng)用過(guò)程中,實(shí)際需要處理的玩家數(shù)量可能過(guò)萬(wàn),一臺(tái)普通的服務(wù)器是無(wú)法完成所要完成的工作,因此,在實(shí)際應(yīng)用的時(shí)候,通常是由一組多臺(tái)服務(wù)器共同完成一個(gè)功能。
例如地圖服務(wù)器,可以根據(jù)需要,把游戲里所有的地域進(jìn)行劃分,劃分為N個(gè)區(qū)域,然后讓這一個(gè)區(qū)域里發(fā)生的事件都用一個(gè)特定的服務(wù)器進(jìn)行處理。這樣做的目的是減少一個(gè)服務(wù)器所承擔(dān)的計(jì)算量,把整個(gè)系統(tǒng)組成一個(gè)分布式的網(wǎng)絡(luò)。
不過(guò)這樣做的同時(shí)會(huì)造成一個(gè)麻煩:當(dāng)一位玩家從區(qū)域1,移動(dòng)到區(qū)域2。這個(gè)時(shí)候,就必須先在服務(wù)器1里把玩家刪除,然后再在區(qū)域2里加入玩家。同時(shí)需要由服務(wù)器1向服務(wù)器2轉(zhuǎn)移玩家的數(shù)據(jù)信息(因?yàn)榉?wù)器組在工作的時(shí)候,玩家的信息只能保存在當(dāng)前所在區(qū)域的服務(wù)器里),也就是說(shuō)一旦玩家發(fā)生服務(wù)器間區(qū)域移動(dòng),服務(wù)器端就不可避免的造成數(shù)據(jù)通訊。因?yàn)檫@種移動(dòng)并不是有規(guī)律的,玩家所在的服務(wù)器都有可能到達(dá)其它服務(wù)器。這樣,如果服務(wù)器組里有N臺(tái)地圖服務(wù)器,那么,每個(gè)服務(wù)器都可能向其它N-1臺(tái)服務(wù)器產(chǎn)生連接,總共就可能產(chǎn)生N×N個(gè)連接。如此數(shù)量連接如果只是使用普通的socket設(shè)計(jì),就很有可能會(huì)給服務(wù)器通訊間的各種問(wèn)題所困擾,為此,在商業(yè)網(wǎng)絡(luò)游戲的服務(wù)器之間,通常都使用成熟的第三方的通訊中間件,如ACE,ICE等作為網(wǎng)絡(luò)連接的傳輸層。
最大的區(qū)別是,web服務(wù)器每個(gè)client都是獨(dú)立的,游戲服務(wù)器不同client是有交互有狀態(tài),會(huì)實(shí)時(shí)地互相影響。這導(dǎo)致很多設(shè)計(jì)上的差異。
并發(fā)架構(gòu)的影響
在高并發(fā)下,對(duì)client請(qǐng)求進(jìn)行負(fù)載均衡并不如web那么簡(jiǎn)單,因?yàn)閏lient狀態(tài)會(huì)互相影響,并且可能共享寫(xiě)數(shù)據(jù)甚至有時(shí)序依賴。大型mmorpg通常是長(zhǎng)連接,并發(fā)服務(wù)數(shù)通常要遠(yuǎn)小于web服務(wù)器 。根源就是實(shí)時(shí)性和強(qiáng)交互性的限制,兩者要求越低的游戲,并發(fā)就可以做得越高。
web服務(wù)運(yùn)算較少,io密集,讀多寫(xiě)少。游戲服計(jì)算和io都密集,讀寫(xiě)都頻繁
對(duì)代碼風(fēng)格的影響
比如開(kāi)發(fā)web服務(wù),基于nginx的openresty就很好用,利用了Lua的協(xié)程和異步io,寫(xiě)起來(lái)很流暢而不失性能。但用來(lái)做游戲服務(wù)器,協(xié)程卻可能是個(gè)坑,因?yàn)橛螒蛞蕾嚭芏嗌舷挛沫h(huán)境,當(dāng)協(xié)程被喚醒時(shí),上下文環(huán)境改變,協(xié)程的代碼風(fēng)格很容易用了舊變量導(dǎo)致邏輯錯(cuò)誤。
類型1:卡牌、跑酷等弱交互服務(wù)端
卡牌跑酷類因?yàn)榻换ト?,玩家和玩家之間不需要實(shí)時(shí)面對(duì)面PK,打一下對(duì)方的離線數(shù)據(jù),計(jì)算下排行榜,買(mǎi)賣(mài)下道具即可,所以實(shí)現(xiàn)往往使用簡(jiǎn)單的 HTTP服務(wù)器:
登錄時(shí)可以使用非對(duì)稱加密(RSA, DH),服務(wù)器根據(jù)客戶端uid,當(dāng)前時(shí)間戳還有服務(wù)端私鑰,計(jì)算哈希得到的加密 key 并發(fā)送給客戶端。之后雙方都用 HTTP通信,并用那個(gè)key進(jìn)行RC4加密。客戶端收到key和時(shí)間戳后保存在內(nèi)存,用于之后通信,服務(wù)端不需要保存 key,因?yàn)槊看味伎梢愿鶕?jù)客戶端傳上來(lái)的 uid 和 時(shí)間戳 以及服務(wù)端自己的私鑰計(jì)算得到。用模仿 TLS的行為,來(lái)保證多次 HTTP請(qǐng)求間的客戶端身份,并通過(guò)時(shí)間戳保證同一人兩次登錄密鑰不同。每局開(kāi)始時(shí),訪問(wèn)一下,請(qǐng)求一下關(guān)卡數(shù)據(jù),玩完了又提交一下,驗(yàn)算一下是否合法,獲得什么獎(jiǎng)勵(lì),數(shù)據(jù)庫(kù)用單臺(tái) MySQL或者 MongoDB即可,后端的 Redis做緩存(可選)。如果要實(shí)現(xiàn)通知,那么讓客戶端定時(shí)15秒輪詢一下服務(wù)器,如果有消息就取下來(lái),如果沒(méi)消息可以逐步放長(zhǎng)輪詢時(shí)間,比如30秒;如果有消息,就縮短輪詢時(shí)間到10秒,5秒,即便兩人聊天,延遲也能自適應(yīng)。
此類服務(wù)器用來(lái)實(shí)現(xiàn)一款三國(guó)類策略或者卡牌及酷跑的游戲已經(jīng)綽綽有余,這類游戲因?yàn)檫壿嫼?jiǎn)單,玩家之間交互不強(qiáng),使用 HTTP來(lái)開(kāi)發(fā)的話,開(kāi)發(fā)速度快,調(diào)試只需要一個(gè)瀏覽器就可以把邏輯調(diào)試清楚了。
類型2:第一代游戲服務(wù)器 1978
1978年,英國(guó)著名的財(cái)經(jīng)學(xué)校University of Essex的學(xué)生 Roy Trubshaw編寫(xiě)了世界上第一個(gè)MUD程序《MUD1》,在University of Essex于1980年接入 ARPANET之后加入了不少外部的玩家,甚至包括國(guó)外的玩家?!禡UD1》程序的源代碼在 ARPANET共享之后出現(xiàn)了眾多的改編版本,至此MUD才在全世界廣泛流行起來(lái)。不斷完善的 MUD1的基礎(chǔ)上產(chǎn)生了開(kāi)源的 MudOS(1991),成為眾多網(wǎng)游的鼻祖:
MUDOS采用 C語(yǔ)言開(kāi)發(fā),因?yàn)橥婕液屯婕抑g有比較強(qiáng)的交互(聊天,交易,PK),MUDOS使用單線程無(wú)阻塞套接字來(lái)服務(wù)所有玩家,所有玩家的請(qǐng)求都發(fā)到同一個(gè)線程去處理,主線程每隔1秒鐘更新一次所有對(duì)象(網(wǎng)絡(luò)收發(fā),更新對(duì)象狀態(tài)機(jī),處理超時(shí),刷新地圖,刷新NPC)。游戲世界采用房間的形式組織起來(lái),每個(gè)房間有東南西北四個(gè)方向可以移動(dòng)到下一個(gè)房間,由于歐美最早的網(wǎng)游都是地牢迷宮形式的,因此場(chǎng)景的基本單位被成為 “房間”。MUDOS使用一門(mén)稱為L(zhǎng)PC的腳本語(yǔ)言來(lái)描述整個(gè)世界(包括房間拓?fù)?,配置,NPC,以及各種劇情)。游戲里面的高級(jí)玩家(巫師),可以不斷的通過(guò)修改腳本來(lái)為游戲添加房間以及增加劇情。早年 MUD1上線時(shí)只有17個(gè)房間,Roy Trubshaw畢業(yè)以后交給他的師弟 Richard Battle,在 Richard Battle手上,不斷的添加各種玩法到一百多個(gè)房間,終于讓 MUD發(fā)揚(yáng)光大。
用戶使用 Telnet之類的客戶端用 Tcp協(xié)議連接到 MUDOS上,使用純文字進(jìn)行游戲,每條指令用回車(chē)進(jìn)行分割。比如 1995年國(guó)內(nèi)第一款 MUD游戲《俠客行》,你敲入:"go east",游戲就會(huì)提示你:“后花園 - 這里是歸云莊的后花園,種滿了花草,幾個(gè)莊丁正在澆花。此地乃是含羞草生長(zhǎng)之地。這里唯一的出口是 north。這里有:花待 阿牧(A mu),還有二位莊?。╖huang Ding)”,然后你繼續(xù)用文字操作,查看阿牧的信息:“l(fā)ook a mu”,系統(tǒng)提示:“花待 阿牧(A mu)他是陸乘風(fēng)的弟子,受命在此看管含羞草。他看起來(lái)三十多歲,生得眉清目秀,端正大方,一表人才。他的武藝看上去【不是很高】,出手似乎【極輕】”。然后你可以選擇擊敗他獲得含羞草,但是你吃了含羞草卻又可能會(huì)中毒死亡。在早期網(wǎng)上資源貧乏的時(shí)候,這樣的游戲有很強(qiáng)的代入感。
用戶數(shù)據(jù)保存在文件中,每個(gè)用戶登錄時(shí),從文本文件里把用戶的數(shù)據(jù)全部加載進(jìn)來(lái),操作全部在內(nèi)存里面進(jìn)行,無(wú)需馬上刷回磁盤(pán)。用戶退出了,或者每隔5分鐘檢查到數(shù)據(jù)改動(dòng)了,都會(huì)保存會(huì)磁盤(pán)。這樣的系統(tǒng)在當(dāng)時(shí)每臺(tái)服務(wù)器承載個(gè)4000人同時(shí)游戲,不是特別大的問(wèn)題。從1991年的 MUDOS發(fā)布后,全球各地都在為他改進(jìn),擴(kuò)充,退出新版本,隨著 Windows圖形機(jī)能的增強(qiáng)。1997游戲《UO》在 MUDOS的基礎(chǔ)上為角色增加的x,y坐標(biāo),為每個(gè)房間增加了地圖,并且為每個(gè)角色增加了動(dòng)畫(huà),形成了第一代的圖形網(wǎng)絡(luò)游戲。
因?yàn)橛螒騼?nèi)容基本可以通過(guò) LPC腳本進(jìn)行定制,所以MUDOS也成為名副其實(shí)的第一款服務(wù)端引擎,引擎一次性開(kāi)發(fā)出來(lái),然后制作不同游戲內(nèi)容。后續(xù)國(guó)內(nèi)的《萬(wàn)王之王》等游戲,很多都是跟《UO》一樣,直接在 MUDOS上進(jìn)行二次開(kāi)發(fā),加入房間的地圖還有角色的坐標(biāo)等要素,該架構(gòu)一直為國(guó)內(nèi)的第一代 MMORPG提供了穩(wěn)固的支持,直到 2003年,還有游戲基于 MUDOS開(kāi)發(fā)。
雖然后面圖形化增加了很多東西,但是這些MMORPG后端的本質(zhì)還是 MUDOS。隨著游戲內(nèi)容的越來(lái)越復(fù)雜,架構(gòu)變得越來(lái)越吃不消了,各種負(fù)載問(wèn)題慢慢浮上水面,于是有了我們的第二代游戲服務(wù)器。
===================
介紹完渠道的概念后,再來(lái)理解為何要把登陸和游戲服務(wù)器分開(kāi)就很容易了。因?yàn)樵谑钟螘r(shí)代,是個(gè)網(wǎng)游都是要接入渠道登陸功能的,因此在開(kāi)發(fā)游戲的初期就應(yīng)該把接入渠道的工作納入開(kāi)發(fā)計(jì)劃之中。
一般運(yùn)營(yíng)的游戲?qū)嶋H負(fù)責(zé)保存游戲數(shù)據(jù)和執(zhí)行服務(wù)端邏輯的服務(wù)器由開(kāi)發(fā)商進(jìn)行部署和維護(hù),而負(fù)責(zé)登陸的服務(wù)器則由渠道負(fù)責(zé)部署和維護(hù)。由于渠道往往擁有很多現(xiàn)成的用戶,以及各種方便快捷的登陸方式(例如微信的自動(dòng)登錄),而這些登陸方式不同平臺(tái)往往差別很大,而渠道間的競(jìng)爭(zhēng)也很激烈,因此大多數(shù)渠道都會(huì)通過(guò)給出現(xiàn)成的登陸模塊(SDK)和統(tǒng)一接口的方式供開(kāi)發(fā)商進(jìn)行接入。
不過(guò)要指出的是,這里的“登陸”應(yīng)該是只單純的用戶名密碼、游客賬號(hào)等等單純的“驗(yàn)證身份”的模塊。事實(shí)上,開(kāi)發(fā)商在自己的游戲服務(wù)器中也會(huì)有單獨(dú)的登陸功能模塊。
舉個(gè)例子,現(xiàn)在有個(gè)由“NETHARD”的公司開(kāi)發(fā)的叫《枕頭大戰(zhàn)》的游戲在小米的平臺(tái)上進(jìn)行運(yùn)營(yíng)。
有個(gè)叫小A的玩家是小米的用戶,賬號(hào)是13854389438,昵稱是“巭孬嫑莪”。
然后他玩了小米上的《枕頭大戰(zhàn)》,用了小米的賬號(hào)進(jìn)行登陸。
然后進(jìn)入游戲后他建了個(gè)叫“伊藤誠(chéng)”的角色。
在普通玩家看來(lái),這整個(gè)一套是一個(gè)非常簡(jiǎn)單的登陸流程。但其實(shí)這里面有三套可以稱之為“賬號(hào)”的系統(tǒng)。
首先是小米平臺(tái)的賬號(hào)(13854389438 - 巭孬嫑莪)。這套賬號(hào)保存在小米的服務(wù)器上。
在登陸了“巭孬嫑莪”后,NETHARD公司獲取了小米提供的身份驗(yàn)證信息,如果這個(gè)身份是第一次在NETHARD的服務(wù)器上登陸,那么NETHARD的服務(wù)器會(huì)為該用戶分配一個(gè)NETHARD內(nèi)部的用戶身份,例如“13854389438%%MI”,并將這兩個(gè)身份進(jìn)行映射。而每次“巭孬嫑莪”在用“13854389438”的賬號(hào)登陸《枕頭大戰(zhàn)》時(shí),NETHARD的服務(wù)器上也會(huì)自動(dòng)通過(guò)“13854389438%%MI”的賬號(hào)進(jìn)行登陸。
最后,存在NETHARD游戲服務(wù)器內(nèi)的角色“伊藤誠(chéng)”則相當(dāng)于第三重賬號(hào)。由于現(xiàn)在的手游網(wǎng)游往往在同一個(gè)賬號(hào)下的角色不共享貨幣(如常見(jiàn)的“元寶”、“鉆石”等等),因此在NETHARD的服務(wù)器內(nèi),“伊藤誠(chéng)”則是一個(gè)獨(dú)立的身份。而NETHARD的賬號(hào)系統(tǒng)則會(huì)將“伊藤誠(chéng)”和“13854389438%%MI”再一次映射起來(lái)。
====================
最后需要指出的是,在上述的流程中其實(shí)是有三臺(tái)服務(wù)器存在的。分別是小米的登陸服務(wù)器、將小米賬號(hào)“13854389438”和NETHARD賬號(hào)“13854389438%%MI”進(jìn)行映射的服務(wù)器以及將“13854389438%%MI”和“伊藤誠(chéng)”進(jìn)行映射的服務(wù)器。而最后那臺(tái)服務(wù)器往往才是真正的游戲服務(wù)器。
至于為什么要將第二臺(tái)服務(wù)器和第三臺(tái)服務(wù)器分開(kāi)?因?yàn)槌恕暗顷憽惫δ芡?,手游還有“計(jì)費(fèi)”模塊。
NETHARD公司自然不會(huì)只有《枕頭大戰(zhàn)》一款游戲。而NETHARD公司還有自己獨(dú)立的財(cái)務(wù)、審計(jì),那么玩家花的每一塊軟妹幣,最后都是要通過(guò)第二臺(tái)服務(wù)器的流水的。
當(dāng)“伊藤誠(chéng)”在游戲里消費(fèi)“¥100”買(mǎi)了一瓶“妹汁”時(shí),首先第三臺(tái)服務(wù)器會(huì)生成一張訂單,告訴第二臺(tái)服務(wù)器“玩家13854389438%%MI買(mǎi)了道具No8989,訂單號(hào)XXX”。第二臺(tái)服務(wù)器則會(huì)告訴小米的服務(wù)器“你的那個(gè)玩家13854389438買(mǎi)了道具No8989,訂單號(hào)XXX”。然后小米在自己的服務(wù)器上查了下,道具No8989的售價(jià)是¥100(這個(gè)信息是游戲在平臺(tái)上發(fā)布前事先注冊(cè)好的信息),然后在獲得“伊藤誠(chéng)”的確認(rèn)后,小米和支付寶進(jìn)行了一系列骯臟的交易,最后小米獲得了¥100,然后告訴第二臺(tái)服務(wù)器“已收到13854389438的贓款,可發(fā)放No8989,訂單號(hào)XXX已完成”,第二臺(tái)再把該信息傳達(dá)給第三臺(tái)服務(wù)器,最后第三臺(tái)服務(wù)器(也就是游戲服務(wù)器)在游戲里把妹汁發(fā)放給了“伊藤誠(chéng)”先生。
當(dāng)然這事兒還沒(méi)完,在月底時(shí),小米會(huì)把¥100中應(yīng)該分成給NETHARD的那一部分給NETHARD,然后兩家公司再各自給自己的臨時(shí)工們發(fā)了餉,大家就各回各家各找各媽了。