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