kbengine底層架構很龐大功能很完善。底層採用c++,而寫邏輯只需要使用python,大家都知道python是一種開發效率非常高的語言。
網絡層被底層封裝的很好,在寫邏輯的時候幾乎可以忘記rpg等細節過程,遠程訪問非常方便
例如訪問客戶端的一個遠程方法:
self.client.func(xxxx)
數據庫的讀寫也變成全自動化了,在一個def文件中對一個實體進行定義底層就能自動建表,自動存儲和讀取, 對於邏輯層而言幾乎可以忽略繁瑣的db操作了, sql文件都不用了。
只關心怎麼使用這些數據。
kbengine下載:
https://github.com/kbengine/kbengine
KBEngine。 這個是我最近使用的。從零開始學習服務器相關的內容,並且在一個月的時間內實現了一個棋牌遊戲(服務器+客戶端)。這個開源的服務器是我感覺最專業,代碼實現最漂亮的。 參考BigWorld引擎,c++加python的實現。理論上可以實現全區全服或者是魔獸世界那樣的mmo。 我之前也想一步到位,學習一個終極的服務器框架,然後可以解決自己的所有問題。 不過現在看來他有幾個缺點(嚴格來說是與我自己的習慣和實際情況有出入),這個也是我要重點分析的,同時也是我選擇遊戲服務器框架的依據。
a、框架結構非常專業,但是同時非常厚重。 編譯時間很長,服務器啓動時間也很長(10~20秒),部署也非常麻煩(在linux上面要安裝openssl,編譯python,設置環境變量)
b、分佈式並不僅僅體現在多個邏輯服務器上面,而體現在多個邏輯服務器(場景服務器)數據可互通。 這個也是KBEngine非常強大的地方。但是我對這方面的需求反而很低,因爲這樣的需求是專爲MMO服務的,但是我要實現一個棋牌遊戲或者手遊並不需要考慮太多的數據互通。 只要把公共數據庫維護好就可以做一個簡單的全區全服的手遊了(比如coc)。 沒有這方面的需求,但是又需要承擔其消耗有點得不償失。
c、python作爲腳本語言,我如果僅僅是實現簡單的邏輯還沒什麼問題。但是一旦我所有的服務器邏輯都是python來實現了,那麼性能就會成爲問題,甚至可能還不如Node.js性能高。 腳本語言比c++、java這樣的靜態編譯的語言開發效率要高,但是實際操作起來卻發現很多不順手的地方,很多靜態語言編譯期就能檢查出來的低級錯誤,現在必須運行時才發現某個變量名寫錯了。 在我看來服務器其實對熱更新並沒有那麼高的需求,而且要做成安全可靠的熱更新是非常困難的,客戶端影響比較小還可以考慮,服務器一旦出錯就成百上千倍的放大。能把配置做成熱加載的,能不關服務器的情況下開啓和關閉某個系統就足夠了。 腳本語言除了開發效率高就是熱更新方便,然而現在看來熱更新需求不大,開發效率也不如使用c#+vs高效。
d、RPC的通信方式很棒,可以讓客戶端和服務器以函數調用的方式來調用遠程函數,而不需要考慮通信細節。 然而我非常不習慣這種方式,當需要傳的數據複雜了,維護起來反而麻煩。而且傳輸效率上來講肯定不如protobuf高。 如果是protobuf來維護的話,只要proto定好了,客戶端和服務器共同使用,有類型修改的時候只要關注proto就可以了。 然而KBEngine中的rpc定義參數修改了需要改三處地方,並且還不是靜態檢查,只有運行時才能發現哪個參數定義的不一致。 另外,如果客戶端和服務器都是使用python的話,應該還是比較方便的,但是客戶端是c#而服務器是python,rpc反而造成了維護的不方便。
e、以實體爲單位管理數據,不需要維護數據庫,只要定義好實體,那麼就會自動將數據保存在數據庫中。這點非常棒,因爲我沒有什麼服務器的經驗,數據庫的優化是我最不放心的地方。 使用KBEngine我完全不需要操心數據庫的東西,只要實體定義好就可以了。 不過這裏也藏着一些坑,萬一它優化的不好怎麼辦? 頻繁的寫數據會不會造成性能問題? 它是如何加載相關性數據的? 會不會因爲某些實體關係定義的不合理,造成內存爆漲?
f、引擎本身有一些小Bug,比如被自己的賬號踢了導致這個賬號再也登不上去了。 經常出現消息延遲較大,但是不知道原因是什麼。 引擎的代碼量還是很大的,要想整理清楚所有的問題還是有一些令人頭疼的地方。
服務端組成
|----------|
| client | x N
|----------|
------------------------|-----|-------------------------------
|----------| |----------| |----------|
| loginsrv | x N | basesrv | x N |basesrvmgr| x 1
|----------| |----------| |----------|
------------------------|-----|-------------------------------
|----------| |----------|
| cellsrv | x N |cellsrvmgr| x 1
|----------| |----------|
------------------------|-----|-------------------------------
|----------| |----------|
| dbmgr | x 1 |interfaces| x 1
|----------| |----------|
------------------------|-----|-------------------------------
|----------|
| mysql | x 1
|----------|
目錄結構:
|- kbengine (KBE_ROOT 根目錄)
|- assets (默認的遊戲項目資產庫,你可以添加新的資產庫通過環境變量綁定)
|- res (所有資源文件)
|- spaces (通常存放遊戲場景相關的資源,例如Navmesh)
|- server (通常放置服務端相關的配置文件)
|- scripts (所有的遊戲邏輯,Python文件)
|- base (Base的Python邏輯)
|- cell (Cell的Python邏輯)
|- client (Client的Python邏輯)
|- bots (機器人的Python邏輯,壓力測試)
|- common (邏輯公共文件夾)
|- data (遊戲邏輯用到的數據資源)
|- db (dbmgr擴展腳本)
|- entity_defs (實體定義與聲明)
|- interfaces (實體的接口聲明)
|- server_common (服務端邏輯公共)
|- user_type (自定義用戶類型目錄)
|- kbe (引擎目錄)
|- tools (引擎工具)
|- server (引擎服務端工具)
|- guiconsole (可視化的控制檯工具)
|- install (引擎安裝工具)
|- pycluster (跨平臺的集羣控制Python腳本工具)
|- xlsx2py (遊戲數據表導出工具)
|- src (KBEngine源代碼)
|- build (makefile公共腳本)
|- client (客戶端插件和例子目錄)
|- kbengine_dll (Windows應用程序插件源代碼)
|- common (公共目錄)
|- lib (各種模塊源代碼)
|- client_lib (客戶端底層公共框架)
|- cstdkbe (KBEngine標準庫)
|- db_mysql (Mysql存取實現)
|- dbmgr_lib (數據存取公共接口)
|- dependencies (依賴庫)
|- entitydef (實體定義解析模塊)
|- helper (一些通用的協助性模塊)
|- math (數學相關)
|- navigation (2D/3D導航模塊)
|- network (網絡模塊)
|- pyscript (腳本插件)
|- python (python源代碼)
|- resmgr (資源管理器)
|- server (服務端公共模塊)
|- thread (多線程模塊)
|- xmlplus (xml解析庫)
|- libs (編譯後的*.lib, *.a文件)
|- server (服務端app源代碼)
|- baseapp (baseapp源代碼)
|- baseappmgr (baseappmgr源代碼)
|- cellapp (cellapp源代碼)
|- cellappmgr (cellappmgr源代碼)
|- dbmgr (dbmgr源代碼)
|- loginapp (loginapp源代碼)
|- machine (machine源代碼)
|- resourcemgr (resourcemgr源代碼)
|- tools (服務端助手工具)
|- interfaces (支持第三方計費、第三方賬號等接口)
|- bots (壓力測試, 虛擬客戶端, 源碼)
|- guiconsole (可視化的控制檯工具源碼)
|- message_log (服務端log收集工具源碼)
|- res (引擎資源目錄)
|- key (RSA密鑰)
|- scripts (Python腳本庫)
|- server (服務端引擎配置)
|- log4cxx_properties (log4cxx配置)
|- doc (指南文檔源代碼)
|- bin (編譯後的可執行文件存放目錄)
|- client (編譯後的客戶端exe可執行文件存放目錄)
|- server (編譯後的服務端可執行文件存放目錄)
|- logs (服務端運行日誌)
|- tutorial (指南文檔)
KBEngine的服務端底層框架使用c++編寫,遊戲邏輯層使用Python(支持熱更新)。現在服務器大多數是用C++做的,python作腳本也比較多,另外一個就是lua。
kbengine底層架構被設計爲多進程分佈式動態負載均衡方案, 理論上只需要不斷擴展硬件就能夠不斷增加承載上限,單臺機器的承載上限取決於遊戲邏輯本身的複雜度。這裏對多進程分佈式不是很理解,以後再解答。
kbengine主要組件
baseapp,baseappmgr,cellapp,cellappmgr,dbmgr,loginapp,machine。
工作組件:
bot,guiconsole,interfaces,logger。
後綴有mgr的組件都是相應的管理器。
數據庫用的是mysql,可以考慮一下加上redis。
必要組件描述
· loginapp:
登錄驗證、註冊、接入口。可在多臺機器部署多個loginapp進程來負載。
· dbmgr:
高性能多線程的數據存取。默認使用Mysql作爲數據庫。
· baseapp:
客戶端與服務端的交互只能通過loginapp分配的baseapp來完成。定時寫entity的數據到數據庫、baseapp數據相互備份、災難恢復。可在多臺機器部署多個baseapp進程來均衡負載。腳本層通常會選擇在baseapp上實現如:社交系統、廣播聊天、排行、遊戲大廳、等等邏輯系統。
· baseappmgr:
協調所有baseapp的工作,包括baseapp負載均衡處理等。
· cellapp:
處理遊戲與空間和位置有關的邏輯,如:AOI、Navigate、AI、戰鬥等等。可在多臺機器部署多個cellapp進程來動態均衡負載。
· cellappmgr:
負責協調所有cellapp的工作,包括負載均衡處理等。
· machine:
抽象出一個服務端硬件節點(一臺硬件服務器只能存在一個這樣的進程)。主要用途是接收遠程指令處理本機上的組件啓動與關閉, 提供本機上運行組件的接入口以及收集當前機器上的一些信息, 如:CPU、內存等。 這些信息會提供給一些對此比較感興趣的組件。
· client:
客戶端我們將提供基礎框架,這個框架不包括渲染部分和輸入輸出部分的具體實現, 我們將提供一個lib文件和一套API接口,開發者可以選擇使用自己比較適合的圖形渲染引擎與輸入輸出控制部分。Unity3D, HTML5, Cocos2d等技術我們提供了相關插件,能夠快速的和服務端對接。
工具組件描述
· interfaces:
支持快速接入第三方計費、第三方賬號、第三方數據, 快速與運營系統耦合。
· logger:
收集和備份各個組件的運行日誌。
其它組件描述
· bots:
機器人,通常用來做壓力測試。
· guiconsole:
可視化控制檯,這個圖形工具只能在Windows運行。