




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
服務(wù)器常用基本框架轉(zhuǎn)自知乎
類型1:卡牌、跑酷等弱交互服務(wù)端
卡牌跑酷類因為交互弱,玩家和玩家之間不需要實時面對面PK,打一下對方的離線數(shù)據(jù),計算下排行榜,買賣下道具即可,所以實現(xiàn)往往使用簡單的HTTP服務(wù)器:
<imgsrc="/b82310466e1546e288b02b8664afd843_b.jpg"data-rawwidth="438"data-rawheight="186"class="origin_imagezh-lightbox-thumb"width="438"data-original="/b82310466e1546e288b02b8664afd843_r.jpg">登錄時可以使用非對稱加密(RSA,DH),服務(wù)器根據(jù)客戶端uid,當(dāng)前時間戳還有服務(wù)端私鑰,計算哈希得到的加密key并發(fā)送給客戶端。之后雙方都用HTTP通信,并用那個key進(jìn)行RC4加密。客戶端收到key和時間戳后保存在內(nèi)存,用于之后通信,服務(wù)端不需要保存key,因為每次都可以根據(jù)客戶端傳上來的uid和時間戳以及服務(wù)端自己的私鑰計算得到。用模仿TLS的行為,來保證多次HTTP請求間的客戶端身份,并通過時間戳保證同一人兩次登錄密鑰不同。登錄時可以使用非對稱加密(RSA,DH),服務(wù)器根據(jù)客戶端uid,當(dāng)前時間戳還有服務(wù)端私鑰,計算哈希得到的加密key并發(fā)送給客戶端。之后雙方都用HTTP通信,并用那個key進(jìn)行RC4加密??蛻舳耸盏絢ey和時間戳后保存在內(nèi)存,用于之后通信,服務(wù)端不需要保存key,因為每次都可以根據(jù)客戶端傳上來的uid和時間戳以及服務(wù)端自己的私鑰計算得到。用模仿TLS的行為,來保證多次HTTP請求間的客戶端身份,并通過時間戳保證同一人兩次登錄密鑰不同。
每局開始時,訪問一下,請求一下關(guān)卡數(shù)據(jù),玩完了又提交一下,驗算一下是否合法,獲得什么獎勵,數(shù)據(jù)庫用單臺MySQL或者M(jìn)ongoDB即可,后端的Redis做緩存(可選)。如果要實現(xiàn)通知,那么讓客戶端定時15秒輪詢一下服務(wù)器,如果有消息就取下來,如果沒消息可以逐步放長輪詢時間,比如30秒;如果有消息,就縮短輪詢時間到10秒,5秒,即便兩人聊天,延遲也能自適應(yīng)。
此類服務(wù)器用來實現(xiàn)一款三國類策略或者卡牌及酷跑的游戲已經(jīng)綽綽有余,這類游戲因為邏輯簡單,玩家之間交互不強,使用HTTP來開發(fā)的話,開發(fā)速度快,調(diào)試只需要一個瀏覽器就可以把邏輯調(diào)試清楚了。
類型2:第一代游戲服務(wù)器1978
1978年,英國著名的財經(jīng)學(xué)校UniversityofEssex的學(xué)生RoyTrubshaw編寫了世界上第一個MUD程序《MUD1》,在UniversityofEssex于1980年接入ARPANET之后加入了不少外部的玩家,甚至包括國外的玩家?!禡UD1》程序的源代碼在ARPANET共享之后出現(xiàn)了眾多的改編版本,至此MUD才在全世界廣泛流行起來。不斷完善的MUD1的基礎(chǔ)上產(chǎn)生了開源的MudOS(1991),成為眾多網(wǎng)游的鼻祖:
<imgsrc="/b647b152f0352f239d9840c29b29e2c9_b.jpg"data-rawwidth="368"data-rawheight="225"class="content_image"width="368">MUDOS采用C語言開發(fā),因為玩家和玩家之間有比較強的交互(聊天,交易,PK),MUDOS使用單線程無阻塞套接字來服務(wù)所有玩家,所有玩家的請求都發(fā)到同一個線程去處理,主線程每隔1秒鐘更新一次所有對象(網(wǎng)絡(luò)收發(fā),更新對象狀態(tài)機,處理超時,刷新地圖,刷新NPC)。MUDOS采用C語言開發(fā),因為玩家和玩家之間有比較強的交互(聊天,交易,PK),MUDOS使用單線程無阻塞套接字來服務(wù)所有玩家,所有玩家的請求都發(fā)到同一個線程去處理,主線程每隔1秒鐘更新一次所有對象(網(wǎng)絡(luò)收發(fā),更新對象狀態(tài)機,處理超時,刷新地圖,刷新NPC)。
游戲世界采用房間的形式組織起來,每個房間有東南西北四個方向可以移動到下一個房間,由于歐美最早的網(wǎng)游都是地牢迷宮形式的,因此場景的基本單位被成為“房間”。MUDOS使用一門稱為LPC的腳本語言來描述整個世界(包括房間拓?fù)?,配置,NPC,以及各種劇情)。游戲里面的高級玩家(巫師),可以不斷的通過修改腳本來為游戲添加房間以及增加劇情。早年MUD1上線時只有17個房間,RoyTrubshaw畢業(yè)以后交給他的師弟RichardBattle,在RichardBattle手上,不斷的添加各種玩法到一百多個房間,終于讓MUD發(fā)揚光大。
用戶使用Telnet之類的客戶端用Tcp協(xié)議連接到MUDOS上,使用純文字進(jìn)行游戲,每條指令用回車進(jìn)行分割。比如1995年國內(nèi)第一款MUD游戲《俠客行》,你敲入:"goeast",游戲就會提示你:“后花園-這里是歸云莊的后花園,種滿了花草,幾個莊丁正在澆花。此地乃是含羞草生長之地。這里唯一的出口是north。這里有:花待阿牧(Amu),還有二位莊?。╖huangDing)”,然后你繼續(xù)用文字操作,查看阿牧的信息:“l(fā)ookamu”,系統(tǒng)提示:“花待阿牧(Amu)他是陸乘風(fēng)的弟子,受命在此看管含羞草。他看起來三十多歲,生得眉清目秀,端正大方,一表人才。他的武藝看上去【不是很高】,出手似乎【極輕】”。然后你可以選擇擊敗他獲得含羞草,但是你吃了含羞草卻又可能會中毒死亡。在早期網(wǎng)上資源貧乏的時候,這樣的游戲有很強的代入感。
用戶數(shù)據(jù)保存在文件中,每個用戶登錄時,從文本文件里把用戶的數(shù)據(jù)全部加載進(jìn)來,操作全部在內(nèi)存里面進(jìn)行,無需馬上刷回磁盤。用戶退出了,或者每隔5分鐘檢查到數(shù)據(jù)改動了,都會保存會磁盤。這樣的系統(tǒng)在當(dāng)時每臺服務(wù)器承載個4000人同時游戲,不是特別大的問題。從1991年的MUDOS發(fā)布后,全球各地都在為他改進(jìn),擴(kuò)充,退出新版本,隨著Windows圖形機能的增強。1997游戲《UO》在MUDOS的基礎(chǔ)上為角色增加的x,y坐標(biāo),為每個房間增加了地圖,并且為每個角色增加了動畫,形成了第一代的圖形網(wǎng)絡(luò)游戲。
因為游戲內(nèi)容基本可以通過LPC腳本進(jìn)行定制,所以MUDOS也成為名副其實的第一款服務(wù)端引擎,引擎一次性開發(fā)出來,然后制作不同游戲內(nèi)容。后續(xù)國內(nèi)的《萬王之王》等游戲,很多都是跟《UO》一樣,直接在MUDOS上進(jìn)行二次開發(fā),加入房間的地圖還有角色的坐標(biāo)等要素,該架構(gòu)一直為國內(nèi)的第一代MMORPG提供了穩(wěn)固的支持,直到2003年,還有游戲基于MUDOS開發(fā)。
雖然后面圖形化增加了很多東西,但是這些MMORPG后端的本質(zhì)還是MUDOS。隨著游戲內(nèi)容的越來越復(fù)雜,架構(gòu)變得越來越吃不消了,各種負(fù)載問題慢慢浮上水面,于是有了我們的第二代游戲服務(wù)器。
類型3:第二代游戲服務(wù)器2003
2000年后,網(wǎng)游已經(jīng)脫離最初的文字MUD,進(jìn)入全面圖形化年代。最先承受不住的其實是很<imgsrc="/84639b389f9c970434e21313a5acd999_b.jpg"data-rawwidth="418"data-rawheight="185"class="content_image"width="418">
每臺Node服務(wù)器用來管理一塊地圖區(qū)域,由NodeMaster(NM)來為他們提供總體管理。更高層次的World則提供大陸級別的管理服務(wù)。這里省略若干細(xì)節(jié)服務(wù)器,比如傳統(tǒng)數(shù)據(jù)庫前端,登錄服務(wù)器,日志和監(jiān)控等,統(tǒng)統(tǒng)用ADMIN概括。在這樣的結(jié)構(gòu)下,玩家從一塊區(qū)域走向另外一塊區(qū)域需要簡單處理一下:
<imgsrc="/61343d4be52424cd1cee4959f580cfeb_b.jpg"data-rawwidth="388"data-rawheight="290"class="content_image"width="388">玩家1完全由節(jié)點A控制,玩家3完全由節(jié)點B控制。而處在兩個節(jié)點邊緣的2號玩家,則同時由A和B提供服務(wù)。玩家2從A移動到B的過程中,會同時向A請求左邊的情況,并向B請求右邊的情況。但是此時玩家2還是屬于A管理。直到玩家2徹底離開AB邊界很遠(yuǎn),才徹底交由B管理。按照這樣的邏輯將世界地圖分割為一塊一塊的區(qū)域,交由不同的Node去管理。玩家1完全由節(jié)點A控制,玩家3完全由節(jié)點B控制。而處在兩個節(jié)點邊緣的2號玩家,則同時由A和B提供服務(wù)。玩家2從A移動到B的過程中,會同時向A請求左邊的情況,并向B請求右邊的情況。但是此時玩家2還是屬于A管理。直到玩家2徹底離開AB邊界很遠(yuǎn),才徹底交由B管理。按照這樣的邏輯將世界地圖分割為一塊一塊的區(qū)域,交由不同的Node去管理。
對于一個Node所負(fù)責(zé)的區(qū)域,地理上沒必要連接在一起,比如大陸的四周邊緣部分和高山部分的區(qū)塊人比較少,可以統(tǒng)一交給一個Node去管理,而這些區(qū)塊在地理上并沒有聯(lián)系在一起的必要性。一個Node到底管理哪些區(qū)塊,可以根據(jù)游戲?qū)崟r運行的負(fù)載情況,定時維護(hù)的時候進(jìn)行更改NodeMaster上面的配置。
于是碰到第一個問題是很多Node服務(wù)器需要和玩家進(jìn)行通信,需要問管理服務(wù)器特定UID為多少的玩家到底在哪臺Gate上,以前按場景切割的服務(wù)器這個問題不大,問了一次以后就可以緩存起來了,但是現(xiàn)在服務(wù)器種類增加不少,玩家又會飄來飄去,按UID查找玩家比較麻煩;另外一方面GATE需要動態(tài)根據(jù)坐標(biāo)計算和哪些Node通信,導(dǎo)致邏輯越來越厚,于是把:“用戶對象”從負(fù)責(zé)連接管理的GATE中切割出來勢在必行于是有了下面的模型:
<imgsrc="/b258799af7d2bec76b90651cfdf696da_b.jpg"data-rawwidth="420"data-rawheight="275"class="content_image"width="420">網(wǎng)關(guān)服務(wù)器再次退回到精簡的網(wǎng)絡(luò)轉(zhuǎn)發(fā)功能,而用戶邏輯則由按照UID劃分的OBJ服務(wù)器來承擔(dān),GATE是按照網(wǎng)絡(luò)接入時的負(fù)載來分布,而OBJ則是按照資源的編號(UID)來分布,這樣和一個用戶通信直接根據(jù)UID計算出OBJ服務(wù)器編號發(fā)送數(shù)據(jù)即可。而新獨立出來的OBJ則提供了更多高層次的服務(wù):網(wǎng)關(guān)服務(wù)器再次退回到精簡的網(wǎng)絡(luò)轉(zhuǎn)發(fā)功能,而用戶邏輯則由按照UID劃分的OBJ服務(wù)器來承擔(dān),GATE是按照網(wǎng)絡(luò)接入時的負(fù)載來分布,而OBJ則是按照資源的編號(UID)來分布,這樣和一個用戶通信直接根據(jù)UID計算出OBJ服務(wù)器編號發(fā)送數(shù)據(jù)即可。而新獨立出來的OBJ則提供了更多高層次的服務(wù):對象移動:管理具體玩家在不同的Node所管轄的區(qū)域之間的移動,并同需要的Node進(jìn)行溝通。數(shù)據(jù)廣播:Node可以給每個用戶設(shè)置若干TAG,然后通知ObjectMaster按照TAG廣播。對象消息:通用消息推送,給某個用戶發(fā)送數(shù)據(jù),直接告訴OBJ,不需要直接和GATE打交道。好友聊天:角色之間聊天直接走OBJ/OBJMASTER。整個服務(wù)器主體分為三層以后,NODE專注場景,OBJ專注玩家對象,GATE專注網(wǎng)絡(luò)。這樣的模型在無縫場景服務(wù)器中得到廣泛的應(yīng)用。但是隨著時間的推移,負(fù)載問題也越來越明顯,做個活動,遠(yuǎn)來不活躍的區(qū)域變得十分活躍,靠每周維護(hù)來調(diào)整還是比較笨重的,于是有了動態(tài)負(fù)載均衡。
動態(tài)負(fù)載均衡有兩種方法,第一種是按照負(fù)載,由NodeMaster定時動態(tài)移動修改一下各個Node的邊界,而不同的玩家對象按照先前的方法從一臺Node上遷移到另外一臺Node上:
<imgsrc="/0c4dcad7e6e8a694a46d6836140b0f5e_b.jpg"data-rawwidth="162"data-rawheight="181"class="content_image"width="162">圖11動態(tài)負(fù)載均衡圖11動態(tài)負(fù)載均衡
這樣NodeMaster定時查找地圖上的熱點區(qū)域,計算新的場景切割方式,然后告訴其他服務(wù)器開始調(diào)整,具體處理方式還是和上面對象跨越邊界移動的方法一樣。
但是上面這種方式實現(xiàn)相對復(fù)雜一些,于是人們設(shè)計出了更為簡單直接的一種新方法:
<imgsrc="/8e250bfe7fc15eb0a0d2925dab684ec2_b.jpg"data-rawwidth="251"data-rawheight="250"class="content_image"width="251">圖12基于網(wǎng)格的動態(tài)負(fù)載均衡圖12基于網(wǎng)格的動態(tài)負(fù)載均衡
還是將地圖按照標(biāo)準(zhǔn)尺寸均勻切割成靜態(tài)的網(wǎng)格,每個格子由一個具體的Node負(fù)責(zé),但是根據(jù)負(fù)載情況,能夠?qū)崟r的遷移到其他Node上。在遷移分為三個階段:準(zhǔn)備,切換,完成。三個狀態(tài)由NodeMaster負(fù)責(zé)維護(hù)。準(zhǔn)備階段新的Node開始同步老Node上面該網(wǎng)格的數(shù)據(jù),完成后告訴NM;NM確認(rèn)OK后同時通知新舊Node完成切換。完成切換后,如果Obj服務(wù)器還在和老的Node進(jìn)行通信,老的Node將會對它進(jìn)行糾正,得到糾正的OBJ將修正自己的狀態(tài),和新的Node進(jìn)行通信。
很多無縫動態(tài)負(fù)載均衡的服務(wù)端宣稱自己支持無限的人數(shù),但不意味著MMORPG游戲的人數(shù)上限真的可以無限擴(kuò)充,因為這樣的體系會受制于網(wǎng)絡(luò)帶寬和客戶端性能。帶寬決定了同一個區(qū)域最大廣播上限,而客戶端性能決定了同一個屏幕到底可以繪制多少個角色。
從無縫地圖引入了分布式對象模型開始,已經(jīng)完全脫離MUDOS體系,成為一種新的服務(wù)端模型。又由于動態(tài)負(fù)載均衡的引入,讓無縫服務(wù)器如虎添翼,容納著超過上一代游戲服務(wù)器數(shù)倍的人數(shù)上限,并提供了更好的游戲體驗,我們稱其為第三代游戲服務(wù)端架構(gòu)。網(wǎng)游以大型多人角色扮演為開端,RPG網(wǎng)游在相當(dāng)長的時間里一度占據(jù)90%以上,使得基于MMORPG的服務(wù)端架構(gòu)得到了蓬勃的發(fā)展,然而隨著玩家對RPG的疲憊,各種非MMORPG游戲如雨后春筍般的出現(xiàn)在人們眼前,受到市場的歡迎。
類型5:戰(zhàn)網(wǎng)游戲服務(wù)器
經(jīng)典戰(zhàn)網(wǎng)服務(wù)端和RPG游戲有兩個區(qū)別:RPG是分區(qū)分服的,北京區(qū)的用戶和廣州區(qū)的用戶老死不相往來。而戰(zhàn)網(wǎng),雖然每局游戲一般都是8人以內(nèi),但全國只有一套服務(wù)器,所有的玩家都可以在一起游戲,而玩家和玩家之使用P2P的方式連接在一起,組成一局游戲:<imgsrc="/40254f76ec9b875314b12fda3d0c5da7_b.jpg"data-rawwidth="493"data-rawheight="352"class="origin_imagezh-lightbox-thumb"width="493"data-original="/40254f76ec9b875314b12fda3d0c5da7_r.jpg">玩家通過MatchMaking服務(wù)器使用:創(chuàng)建、加入、自動匹配、邀請等方式組成一局游戲。服務(wù)器會選擇一個人做Host,其他人P2P連接到做主的玩家上來。STUN是幫助玩家之間建立P2P的牽引服務(wù)器,而由于P2P聯(lián)通情況大概只有75%,實在聯(lián)不通的玩家會通過Forward進(jìn)行轉(zhuǎn)發(fā)。玩家通過MatchMaking服務(wù)器使用:創(chuàng)建、加入、自動匹配、邀請等方式組成一局游戲。服務(wù)器會選擇一個人做Host,其他人P2P連接到做主的玩家上來。STUN是幫助玩家之間建立P2P的牽引服務(wù)器,而由于P2P聯(lián)通情況大概只有75%,實在聯(lián)不通的玩家會通過Forward進(jìn)行轉(zhuǎn)發(fā)。
大量的連接對戰(zhàn),體育競技游戲采用類似的結(jié)構(gòu)。P2P有網(wǎng)狀模型(所有玩家互相連接),和星狀模型(所有玩家連接一個主玩家)。復(fù)雜的游戲狀態(tài)在網(wǎng)狀模型下難以形成一致,因此星狀P2P模型經(jīng)受住了歷史的考驗。除去游戲數(shù)據(jù),支持語音的戰(zhàn)網(wǎng)系統(tǒng)也會將所有人的語音數(shù)據(jù)發(fā)送到做主的那個玩家機器上,通過混音去重再編碼的方式返回給所有用戶。
戰(zhàn)網(wǎng)類游戲,以競技、體育、動作等類型的游戲為主,較慢節(jié)奏的RPG(包括ARPG)有本質(zhì)上的區(qū)別,而激烈的游戲過程必然帶來到較RPG復(fù)雜的多的同步策略,這樣的同步機制往往帶來的是很多游戲結(jié)果由客戶端直接計算得出,那在到處都是破解的今天,如何保證游戲結(jié)果的公正呢?
主要方法就是投票法,所有客戶端都會獨立計算,然后傳遞給服務(wù)器。如果結(jié)果相同就更新記錄,如果結(jié)果不一致,會采取類似投票的方式確定最終結(jié)果。同時記錄本劇游戲的所有輸入,在可能的情況下,找另外閑散的游戲客戶端驗算整局游戲是否為該結(jié)果。并且記錄經(jīng)常有作弊嫌疑的用戶,供運營人員封號時參考。
類型7:休閑游戲服務(wù)器
休閑游戲同戰(zhàn)網(wǎng)服務(wù)器類似,都是全區(qū)架構(gòu),不同的是有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度酒店與客戶婚宴客房預(yù)訂服務(wù)協(xié)議
- 2025年度紡織品代理進(jìn)口合同模板(含環(huán)保要求)
- 2025年度集體合同爭議解決機制與協(xié)商策略
- 2025年度木門廠家品牌授權(quán)合同模板
- 二零二五年度智能城市項目管理勞動合同
- 二零二五年度企業(yè)文員崗位工作績效提升合同
- 二零二五年度全新土地承包合同終止征收補償與農(nóng)村集體資產(chǎn)重組協(xié)議
- 二零二五年度超市加盟店經(jīng)營授權(quán)合同
- 2025年度航空航天復(fù)合材料制造廠房租賃協(xié)議
- 二零二五年度老舊小區(qū)建筑裝飾工程改造合同
- 2022年陜西省西安交通大學(xué)少年班自主招生數(shù)學(xué)試題及答案
- 市場營銷考試試題及答案(考試大全必備)
- 三年級下冊口算天天100題(A4打印版)
- 2021年大唐集團(tuán)招聘筆試試題及答案
- DBJ53/T-39-2020 云南省民用建筑節(jié)能設(shè)計標(biāo)準(zhǔn)
- 初中 初一 勞動教育《舉辦一次家庭聚會》教學(xué)設(shè)計
- 人教版六年級上冊數(shù)學(xué)第六單元測試卷(百分?jǐn)?shù)(一))
- 《基礎(chǔ)英語》課件 Unit 1 Thinking as a Hobby
- 雅思大作文資料_十大類題材_解析詳細(xì)_應(yīng)有盡有(最好全部打印后看_非常全)
- 小學(xué)綜合實踐食品添加劑
- 電氣消防設(shè)計說明專篇
評論
0/150
提交評論