標籤:

基於C++/Lua的遊戲伺服器如何實現?

請盡量詳細,特別是遊戲主體邏輯的實現,我能看懂。


1.首先要自己實現一個網路庫,或者選擇已經開源的網路庫。比如:muduo、libevent、boost的asio等。

2.實現核心功能:連接管理,消息管理,定時器,事件機制,Lua腳本引擎,程序模塊管理。

3.實現完2中的功能後就可以用這些搭建分散式的程序了。可以著手實現網關, DB伺服器,以及遊戲邏輯伺服器等等。


關於C++與Lua的關係,首先並不是說所有的遊戲,都需要Lua。

對於你的問題,我希望你從中先了解,為什麼有些遊戲要用Lua作為遊戲腳本。

回答這個問題,首先了解Lua是什麼,能幹什麼,優點在哪裡,弱點在哪裡,適用於那些場景?

首先,請指導Lua和其他一些腳本語言在場景使用上,是作為一種C++的輔助存在的(當然也有全部使用Lua實現的actor模型,比如skynet)。一般和C++配合的常用腳本有Lua,Python,js,erlang等等,他們的特性是,獨立的虛擬機,所有腳本內運行的變數和內存與C++的服務內存相對獨立,同時,腳本的優勢是載入。文件適合實時載入。改變腳本邏輯甚至可以不用程序員動筆(這是最主要的)程序員提供C++的API為腳本的介面和積木,寫腳本的可以是策劃,只要懂得積木的定義,就可以按照自己的規則取用積木,遊戲邏輯的修改不在依靠程序開發,解放了生產力。

其次,你也要知道,腳本也有弱點,就像雙刃劍,你用不好反而會給你造成巨大的麻煩。因為腳本基本都是基於虛擬機的,跨平台特性明顯,但是這也是一個可怕的陷阱,因為你無法管理虛擬機的內存,所以,在你Lua和C++設計介面不好的時候,內存泄露往往會導致你的腳本虛擬機吃光你的內存,你還不知道問題在哪裡。(別和我說自動GC,GC解決不了所有的內存申請釋放問題,你你無法把控Lua對象內部的真正釋放和建立的時間,所以你就無法知曉任意時刻,你的內存消耗到底是多少,C++就可以做到任何時刻可以清楚的知道你的內存是多少位元組),如果Lua的內存巨大吃光了你的伺服器內存,你很難快速定位問題。

所以,好的C++和Lua的應用,取決於好的設計者。你必須明確,Lua只是作為一種腳本,提供上層服務,且,在腳本內,你的變數,內存使用是盡量可控的。

不要認為,會寫C++和Lua之間的通訊代碼,就等會會用它,這是兩碼事。

從設計角度來講,C++是適合解決繁複重複性的工作,也就是說,一些不易改變的規則,且需要頻繁計算和調用的。比如戰鬥中血量計算,武器的傷害計算,物品合成,掉落計算,人物的移動,等等。

那麼,什麼適合放在Lua里去做呢?

我可以用Lua創建一個腳本,實現下面的偽代碼。

副本_購物()

{

GET_PLAY_INFO(獲得當前用戶信息)

PLAY_TASK_VALID(用戶是否滿足條件去購物?(有沒有錢,有沒有時間,有沒有其他任務?)

MOVE(去購物的地點)

TALK(和店員交涉)

CHOOSE(決定是否購物)

BUY(購買完成)

MOVE(回家)

}

你看,上述的所有英文部分,實際是C++程序員實現的API。

那麼Lua腳本做什麼呢?

就是組裝順序。

C++程序員,提供積木,那麼什麼樣的房子,策劃你自己去建吧,建不出來,要麼C++的積木不夠,要麼策劃自己也不知道自己要什麼。

知道自己要什麼,如何選擇很重要。

而且,要回尋找工具,C++與Lua的開源非常多。

比如我自己寫的,自動C++和Lua的代碼生成工具,架構師給出相關API,程序員和策划去做填空。

問題的核心是,我們以什麼心態去解決問題,而不是這麼做看上去很酷。

GitHub - freeeyes/XMLLua2Cpp: used XML auto create lua and C++ relevance code and test code

另外推薦雲風的skynet值得一讀。當然,是有適用場景的。

GitHub - cloudwu/skynet: A lightweight online game framework


不如用python,lua的社區支持太弱。很多東西需要DIY


推薦閱讀:

漢家江湖論劍系統技術全解析(遊戲伺服器組、分散式調度計算系統)
關於遊戲伺服器框架,網易的pomelo怎麼樣,用來開發手機遊戲靠不靠譜?除了這個還有別的開放架構嗎?
為什麼php,jsp很少用於遊戲服務端的開發?
網路遊戲伺服器開發,有哪些經典書籍?
遊戲服務端中的分散式 ,集群?

TAG:遊戲伺服器 |