約束性能和容量規(guī)模的因素歸納起來(lái)是:數(shù)據(jù)共享域,消息廣播域,運(yùn)算共享域。這幾個(gè)因素涉及的對(duì)象數(shù)量會(huì)直接影響了架構(gòu)涉及,下面分別來(lái)說(shuō)。
分類特征:
玩家數(shù)據(jù)總量,同時(shí)在線數(shù)
這里是指,玩家登錄后,需要從多大規(guī)模的數(shù)據(jù)中讀取自己的數(shù)據(jù)。social game全局共享的角色數(shù)據(jù)(統(tǒng)一世界),隨著玩家數(shù)量增多線性增長(zhǎng),往往單機(jī)儲(chǔ)存不能滿足需求,需要分布式儲(chǔ)存技術(shù)。而對(duì)于傳統(tǒng)MMORPG,由于是分服(服務(wù)器之間是平衡世界,角色數(shù)據(jù)相互獨(dú)立),相當(dāng)于天然地用服務(wù)器id做了數(shù)據(jù)分區(qū)(而不需要像分布式儲(chǔ)存那樣考慮分區(qū)算法的擴(kuò)展性問題),除了登錄信息,沒有全局?jǐn)?shù)據(jù),單機(jī)儲(chǔ)存即可解決問題。
AOI范圍與頻率
這里指的是游戲過(guò)程中,即時(shí)廣播涉及的對(duì)象數(shù)量以及消息密度,比如同屏玩家數(shù)。競(jìng)技和休閑類游戲通常比較小,而傳統(tǒng)MMORPG通常較大。
范圍和頻率還影響client間傳輸消息的方式,通常有兩種:client間直傳(P2P); 中心服轉(zhuǎn)發(fā)。從延時(shí)來(lái)看,廣域網(wǎng)游戲這兩者區(qū)別到不大(前提是中心服不卡,其實(shí)可以看做一個(gè)路由器)。如果廣播范圍 x 頻率較大,中心服的帶寬成本很高(嗯嗯,帶寬是很貴的)。如果采用純P2P,則需要考慮客戶端作弊問題。當(dāng)然還可以用混合的方法,即中心服監(jiān)督下的P2P,比如有些競(jìng)技游戲在服務(wù)端也做一層校驗(yàn),查出外掛的可能,當(dāng)然這個(gè)不容易實(shí)現(xiàn)得好。 大部分情況下,服務(wù)器監(jiān)督一切,最省心。
AOI跳轉(zhuǎn)方式
是指在不同運(yùn)算共享域和廣播域直接切換的方式,分為無(wú)縫和跳轉(zhuǎn)點(diǎn)。舉個(gè)例子,休閑游戲和競(jìng)技游戲通常是玩家主動(dòng)點(diǎn)擊進(jìn)入或退出房間/頻道,不同房間/頻道分隔了廣播域。而即時(shí)制MMORPG(比如WOW)區(qū)域之間是無(wú)邊界的。這兩者區(qū)別影響運(yùn)算性能的擴(kuò)展性,即實(shí)現(xiàn)多進(jìn)程處理的技術(shù)難度。對(duì)于前者可以很容易實(shí)現(xiàn)多進(jìn)程分擔(dān)處理任務(wù)。后者的無(wú)縫AOI,要實(shí)現(xiàn)多進(jìn)程的話,在邊界處需要較復(fù)雜的進(jìn)程數(shù)據(jù)同步技術(shù)。
實(shí)時(shí)性/同步要求
網(wǎng)絡(luò)延時(shí)的前提下,同步方案主要是用戶體驗(yàn)和數(shù)據(jù)正確性之間的權(quán)衡。競(jìng)技和動(dòng)作游戲強(qiáng)調(diào)打擊感和位置準(zhǔn)確性,需要很高的同步要求。很多游戲采用幀同步方案,即一旦對(duì)應(yīng)幀數(shù)據(jù)未到,卡住整個(gè)客戶端(dota的等待連線)。也有采用運(yùn)動(dòng)補(bǔ)償?shù)姆绞?也稱追影),即客戶端預(yù)判,當(dāng)和服務(wù)端位置不一致時(shí),通過(guò)加速等方式平滑追上。為了減少延時(shí)帶來(lái)的影響,一部分計(jì)算放在客戶端,關(guān)鍵計(jì)算等待服務(wù)器返回。在等待服務(wù)器返回結(jié)果的過(guò)程中,通常結(jié)合美術(shù)和技術(shù)手段"欺騙"玩家的視覺(比如起手動(dòng)作),達(dá)到較好的體驗(yàn)。
Social game
玩法:策略經(jīng)營(yíng)類,好友互動(dòng)
玩家數(shù)量大,冷數(shù)據(jù)總量大 (海量玩家同一交互域),同時(shí)在線高;
AOI范圍中。頻率低。消息在好友之間分發(fā)(好友數(shù)量一般在一百以內(nèi))
實(shí)時(shí)性/同步要求:低,不需要實(shí)時(shí)。運(yùn)算較簡(jiǎn)單(看成是海量數(shù)據(jù)的CURD應(yīng)用)
技術(shù)特點(diǎn):跟微博,QQ群等傳統(tǒng)互聯(lián)網(wǎng)應(yīng)用比較接近:數(shù)據(jù)量大,AOI范圍中,實(shí)時(shí)要求低。主要難點(diǎn)在于讀寫規(guī)模大,總數(shù)據(jù)量大,cache熱度不明顯(無(wú)明顯熱數(shù)據(jù))。
性能擴(kuò)展:依賴于分布式儲(chǔ)存和讀寫技術(shù),與一般社交網(wǎng)絡(luò)技術(shù)類似。由于需要預(yù)先加好友,設(shè)定好友數(shù)量上限可以限制數(shù)據(jù)廣播的規(guī)模。
休閑棋牌類游戲
玩家數(shù)量大;冷數(shù)據(jù)總量大;但登錄后通常進(jìn)入房間。
房間之間分隔了廣播域,游戲局之間玩家互相獨(dú)立(除了聊天頻道)。意味著較容易根據(jù)房間和游戲分服/進(jìn)程,性能擴(kuò)展容易。
AOI范圍低(一局游戲的幾個(gè)人),實(shí)時(shí)性一般。運(yùn)算一般(棋牌算法計(jì)算)。
架構(gòu)上通常分前端(登錄和房間邏輯)和后端(具體一局游戲),分服設(shè)計(jì)較容易。通常一個(gè)前端要對(duì)應(yīng)很多種不同類型的后端邏輯(各種類型游戲),需要制定一個(gè)容易開發(fā)和接入的框架。
容量擴(kuò)展:由于游戲局的獨(dú)立性,分進(jìn)程/分服做運(yùn)算擴(kuò)展比較簡(jiǎn)單。 通過(guò)分區(qū)分房間限制了數(shù)據(jù)廣播規(guī)模。
競(jìng)技類游戲
玩法:dota, FPS, 格斗動(dòng)作類
AOI范圍低(10人以下),交互頻率高
實(shí)時(shí)交互和同步要求極高(技術(shù)難點(diǎn))
容量擴(kuò)展:通常與休閑類一樣,先進(jìn)入房間(有些叫頻道)限制數(shù)據(jù)廣播規(guī)模。不同房間互相獨(dú)立,因此也較容易通過(guò)增加進(jìn)程/服務(wù)器分散運(yùn)算規(guī)模。
即時(shí)制MMORPG
通常技能有cooldown, 玩家之間可以穿插(沒有動(dòng)態(tài)碰撞檢測(cè)),同步要求低于動(dòng)作類和dota網(wǎng)游。單服同時(shí)在線人數(shù)有限(1w人左右),邏輯復(fù)雜, IO通常單機(jī)就可搞定。AOI通常是運(yùn)算瓶頸,要提高容量就要分進(jìn)程或分線程。對(duì)于區(qū)域間無(wú)縫世界,在邊界處的對(duì)象,由于互相可見且可戰(zhàn)斗,分管兩個(gè)區(qū)域的進(jìn)程間需要較復(fù)雜的同步機(jī)制。比如bigworld用的是對(duì)象代理技術(shù),即在原區(qū)域是real對(duì)象,對(duì)端區(qū)域建立一個(gè)ghost(代理對(duì)象), 對(duì)real對(duì)象的所有狀態(tài)改變即時(shí)同步到對(duì)端進(jìn)程,反之對(duì)ghost操作也同步到real。也就是說(shuō)玩家A在兩個(gè)進(jìn)程都有自己的副本,且都可寫,需要借鑒分布式技術(shù)中,多Writer的數(shù)據(jù)一致性設(shè)計(jì)。
對(duì)MMORPG來(lái)說(shuō),單服人數(shù)越高,游戲的社區(qū)性和人氣感就越強(qiáng), 但人數(shù)越多,就越容易卡住服務(wù)器。現(xiàn)在都是多核的世界,基本上都是多線程/進(jìn)程的架構(gòu)了,多writer/reader, 數(shù)據(jù)同步,鎖這些是常見技術(shù)考量點(diǎn)。一般功能模塊交互性不強(qiáng),分進(jìn)程/線程難度不大,但AOI這塊分進(jìn)程要比較折騰。
題外話
這兩年公司的校園招聘,程序員的title是虛擬世界架構(gòu)師(汗 -_-!)。真正的虛擬世界應(yīng)該是:數(shù)據(jù)規(guī)模大,AOI范圍大,實(shí)時(shí)交互。以上還沒有一種游戲同時(shí)符合幾個(gè)特征,都不同程度通過(guò)分區(qū)/分服/分房間/分場(chǎng)景/分頻道分隔了單個(gè)進(jìn)程的處理規(guī)模,單臺(tái)服務(wù)器的數(shù)據(jù)規(guī)模和帶寬規(guī)模。當(dāng)然,即使技術(shù)上可行,玩家腦子同時(shí)能處理的對(duì)象數(shù)比電腦要差多了(呃,試想數(shù)萬(wàn)人同處一個(gè)場(chǎng)景,然后走來(lái)走去,這個(gè)有游戲性可言?),這時(shí)候瓶頸不在服務(wù)器,超密集的角色,客戶端的渲染效率變成瓶頸。