遊戲伺服器的設計是一項頗有挑戰性的工作,遊戲伺服器的發展也由以前的單服結構轉變為多服機構,甚至出現了bigworld引擎的分布式解決方案,最近瞭解到Unreal的伺服器解決方案atlas也是基於叢集的方式。
負載平衡是一個很複雜的課題,這裡暫不談bigworld和atlas的這類伺服器的設計,更多的是基於功能和情境劃分伺服器結構。
首先說一下思路,伺服器劃分基於以下原則:
1:分離遊戲中佔用系統資源(cpu,記憶體,IO等)較多的功能,獨立成伺服器
2:在同一伺服器架構下的不同遊戲,應儘可能的複用某些伺服器(進程層級的複用)
3:以多線程並發的編程方式適應多核處理器。
4:寧可在伺服器之間多複製資料,也要保持清晰的資料流向
5:主要按照情境劃分進程,若需按功能劃分,必須保持整個邏輯足夠的簡單,並滿足以上1,2點
伺服器結構圖:
各個伺服器的簡要說明:
Gateway:應用網關,主要用於保持和client的串連,該伺服器需要2種IO,對client採用高並發串連,低輸送量的網路模型,如IOCP等,對伺服器採用高輸送量串連,如阻塞或非同步IO。
網關主要有以下用途:
1:分擔了網路IO資源
2:同時,也分擔了網路訊息包的加解密,壓縮解壓等cpu密集的操作。
3:隔離了client和內部伺服器組,對client來說,它只需要知道網關的相關資訊即可(ip和port)。
4:client由於一直和網關保持常串連,所以切換情境伺服器等操作對client來說是透明的。
5:維護玩家登入狀態
World Server 是一個控制中心,它負責把各種計算資源分布到各個伺服器
它具有以下職責:
1:管理和維護多個Scene Server
2:管理和維護多個功能伺服器,主要是同步資料到功能伺服器
3:複雜轉寄其他伺服器和Gateway之間的資料
4:實現其他需要跨情境的功能,如組隊,聊天,幫派等
Phys Server 主要用於玩家移動,碰撞等檢測
所有玩家的移動類操作都在該伺服器上做檢查,所以該伺服器本身具備所有地圖的地形等相關資訊。具體檢查過程是這樣的:首先,Worldserver收到一個移動資訊,WorldServer收到後向Phys Server請求檢查,Phys Server檢查成功後再返回給world Server,然後world server傳遞給相應的Scene Server.
Scene Server 情境伺服器,按情境劃分,每個伺服器負責的情境應該是可以配置的。理想情況下是可以動態調節的。
ItemMgr Server 物品管理伺服器,負責所有物品的生產過程。在該伺服器上儲存一個物品掉落資料庫,伺服器初始化的時候載入到記憶體。任何需要產生物品的伺服器均與該伺服器直接通訊
AIServer 又一個功能伺服器,負責管理所有NPC的AI。AI伺服器通常有2個輸入,一個是Scene Server發送過來的玩家相關操作資訊,另一個時鐘Timer驅動,在這個設計中,對其他伺服器來說,AIServer就是一個擁有很多個NPC的用戶端。AIserver需要同步所有與AI相關的資料,包括很多玩家資料。由於AIServer的Timer驅動特性,可在很大程度上使用TBB程式庫來發揮多核的效能。
==========================================================================
寫的不錯..
不過有幾點值得商榷:
1.Phys Server 伺服器的分離,這個會使邏輯變的複雜很多.比如技能的可見度判斷等就會非同步過程.
2.ItemMgr Server 這個覺得沒必要,DB保持的負荷可以用專門的DB伺服器來負責.
3.AIServer一般來說,都是伺服器CPU負荷的大頭,分離的想法不錯,我們就是這麼做的.效果很好.不過全定時器響應也是有效率和 響應速度的瓶頸.部分採用事件響應,會使遊戲表現好很多.
最後一點,伺服器除了通訊底層外,邏輯層盡量別用多線程.
合理分布式的多進程設計即可解決問題.