游戲服務器開發功能性需求
游戲服務器開發功能性需求
并發:所有的游戲服務器程序,都會碰到這個基本的問題:如何處理并發處理。一般來說,會有多線程、異步兩種技術。多線程編程在編碼上比較符合人類的思維習慣,但帶來了“鎖”這個問題。而異步非阻塞的模型,其程序執行的情況是比較簡單的,而且也能比較充分的利用硬件性能,但是問題是很多代碼需要以“回調”的形式編寫,對于復雜的業務邏輯來說,顯得非常繁瑣,可讀性非常差。雖然這兩種方案各有利弊,也有人結合這兩種技術希望能各取所長,但是我更傾向于基礎是使用異步、單線程、非阻塞的調度方式,因為這個方案是最清晰簡單的。為了解決“回調”的問題,我們可以在其上再添加其他的抽象層,比如協程或者添加線程池之類的技術予以改善。
通信:支持請求響應 模式以及 通知 模式的通信(廣播視為一種多目標的通知)。游戲有很多登錄、買賣、打開背包之類的功能,都是明確的有請求和響應的。而大量的聯機游戲中,多個客戶端的位置、HP 等東西都需要經過網絡同步,其實就是一種“主動通知”的通信方式。
持久化:可以存取 對象 。游戲存檔的格式非常復雜,但其索引的需求往往都是根據玩家 ID 來讀寫就可以。在很多游戲服務器如 PlayStation 上,以前的存檔都是可以以類似“文件”的方式存放在記憶卡里的。所以游戲持久化最基本的需求,就是一個 key-value 存取模型。當然,游戲中還會有更復雜的持久化需求,比如排行榜、拍賣行等,這些需求應該額外對待,不適合包含在一個最基本的通用底層中。
緩存:支持遠程、分布式的對象緩存。游戲服務基本上都是“帶狀態”的服務,因為游戲要求響應延遲非常苛刻,基本上都需要利用服務器進程的內存來存放過程數據。但是游戲的數據,往往是變化越快的,價值越低,比如經驗值、金幣、HP,而等級、裝備等變化比較慢的,價值則越高,這種特征,非常適合用一個緩存模型來處理。
協程:可以用 C++ 來編寫協程代碼,避免大量回調函數分割代碼。這個是對于異步代碼非常有用的特性,能大大提高代碼的可讀性和開發效率。特別是把很多底層涉及IO的功能,都提供了協程化 API,使用起來就會像同步的 API 一樣輕松愜意。
腳本:初步設想是支持可以用 Lua 來編寫業務邏輯。游戲需求變化是出了名快的,用腳本語言編寫業務邏輯正好能提供這方面的支持。實際上腳本在游戲行業里的使用非常廣泛。所以支持腳本,也是一個游戲服務器框架很重要的能力。
其他功能:包括定時器、游戲服務器端的對象管理等等。這些功能很常用,所以也需要包含在框架中,但已經有很多成熟方案,所以只要選取常見易懂的模型即可。比如對象管理,我會采用類似 Unity 的組件模型來實現。【艾娜】