Posted on 2012-07-13 13:49
點(diǎn)點(diǎn)滴滴 閱讀(1237)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
10 服務(wù)器
Mangos有13個(gè)工程。
使用了4個(gè)外部工具庫(kù),分別是:
- 跨平臺(tái)的網(wǎng)絡(luò)通訊框架The ADAPTIVE Communication Environment (ACE)
- 壓縮庫(kù)zlib
- Socket通信庫(kù) C++ Sockets Library (使用在realmd工程中,和使用在Mangosd工程中的RASocket,負(fù)責(zé)處理Remote Administration。其他地方?jīng)]有使用到這個(gè)C++ Sockets Library )。發(fā)現(xiàn)在C++ Sockets Library的TcpSocket::Open中存在一個(gè)問題,在n = connect(s, ad, ad);語(yǔ)句執(zhí)行后,如果n=-1,C++ Sockets Library會(huì)檢測(cè)是否ERR為WSAEWOULDBLOCK,否則表示成功,但在動(dòng)態(tài)庫(kù)中使用TcpSocket的時(shí)候,我發(fā)現(xiàn)n = connect(s, ad, ad);語(yǔ)句執(zhí)行后,n=-1,ERR會(huì)為0,這個(gè)時(shí)候連接也是成功了,但TcpSocket::Open會(huì)當(dāng)做不成功處理。我發(fā)現(xiàn)這個(gè)問題,但沒有時(shí)間去探究原因,也許并不是一個(gè)問題。
- C++的并行編程模板庫(kù)Threading Building Blocks (tbb 和 tbbmalloc)
Mangos的實(shí)現(xiàn)分為:登錄服務(wù)器(realmd)和世界服務(wù)器(mangosd+game)。realmd和mangos共用了Mangos公共庫(kù)(shared)。
工程shared
提供了通用功能,包括了數(shù)據(jù)庫(kù)的封裝類,實(shí)現(xiàn)了對(duì)MySql的訪問,同樣,我們可以編寫派生類來支持其他的數(shù)據(jù)庫(kù)。
工程script
提供了腳本接口,并實(shí)現(xiàn)了簡(jiǎn)單的幾個(gè)腳本,封裝為DLL,提供給game使用,具體可參考:MaNGOS腳本接口。
通過使用不同的腳本DLL來替換Mangos中的AI實(shí)現(xiàn),可以讓game具有更強(qiáng)的AI。ScriptDev2 就是一個(gè)這樣的庫(kù)。ScriptDev2 is a replacement for the Script Library that comes with MaNGOS( http://www.getmangos.com ) written in C++ and is compatible with Windows and Linux. It provides scripts for NPCs, Boss events, and Items currently. Once ScriptDev2 is compiled it is automatically run by MaNGOS on server startup.

工程mangosd
mangos是世界服務(wù)器的管理器,負(fù)責(zé)初始化工作和啟動(dòng)世界服務(wù)器各層的線程,這些工作主要是由類Master來實(shí)現(xiàn)。具體是:
- 使用三個(gè)數(shù)據(jù)庫(kù)對(duì)象WorldDatabase和CharacterDatabase和loginDatabase,初始化三大數(shù)據(jù)庫(kù):World Database和Character Database和login Database,并為每個(gè)數(shù)據(jù)庫(kù)的訪問都啟動(dòng)一個(gè)DB delay threads。具體的數(shù)據(jù)庫(kù)操作功能都是由Mangos公共庫(kù)shared來提供。
- 調(diào)用sWorld.SetInitialWorldSettings,對(duì)World進(jìn)行初始化,包括加載所有的游戲數(shù)據(jù)和初始化各種更新定時(shí)器和郵件定時(shí)器,還有些其他的初始化工作。類World的成員函數(shù)SetInitialWorldSettings調(diào)用成員函數(shù)LoadConfigSettings解析mangosd.conf,解析后內(nèi)容放入uint32 m_configs[CONFIG_VALUE_COUNT]中。
- 加載的游戲數(shù)據(jù)有:
- DBC數(shù)據(jù)
- Objects數(shù)據(jù)
- Spells數(shù)據(jù)
- Pooling數(shù)據(jù)
- Game Event數(shù)據(jù)
- loot數(shù)據(jù)
- 技能數(shù)據(jù)
- 所有其他的游戲數(shù)據(jù),包括Waypoints和Trainers等等等。
- 腳本數(shù)據(jù)
- 初始化的更新定時(shí)器有:
- WUPDATE_OBJECTS
- WUPDATE_SESSIONS
- WUPDATE_AUCTIONS
- WUPDATE_WEATHERS
- WUPDATE_UPTIME
- WUPDATE_CORPSES
- WUPDATE_EVENTS
- 其他的初始化工作有:
- 初始化MapManager,啟動(dòng)Map System
- 初始化Battlegrounds,啟動(dòng)BattleGround System
- 初始化DailyQuestResetTime
- 初始化sGameEventMgr,Starting Game Event system
- 類Master還實(shí)現(xiàn)了mangos server的退出管理
- 類Master啟動(dòng)WorldRunnable,開始游戲邏輯。Heartbeat for the World,由Master創(chuàng)建,并設(shè)置線程為最高優(yōu)先級(jí)。
- 類Master啟動(dòng)CliRunnable:Command Line Interface handling thread,由Master創(chuàng)建。CliRunnable運(yùn)行時(shí)候會(huì)生成一個(gè)WorldDatabase線程,在接收到輸入后會(huì)調(diào)用sWorld.QueueCliCommand把Cmd放入到World::cliCmdQueue中。
- 類Master啟動(dòng)RARunnable:Remote Administration,由Master創(chuàng)建
- 如果配置要求,類Master還會(huì)啟動(dòng)一個(gè)freeze catcher thread
- 類Master啟動(dòng)2個(gè)網(wǎng)絡(luò)線程ReactorRunnable(可配置數(shù)目)
mangosd的線程總共有(1+3+1+1+1+2 +1 =10)10個(gè)線程。
- 主線程Master
- 2個(gè)網(wǎng)絡(luò)線程ReactorRunnable(可配置數(shù)目)(網(wǎng)絡(luò)層)
- 一個(gè)World線程(邏輯層)
- 三個(gè)DB線程(數(shù)據(jù)層)
- 一個(gè)CLI線程(輸入層),運(yùn)行時(shí)候會(huì)生成一個(gè)WorldDatabase線程
- 一個(gè)RA線程(管理層)
- 一個(gè)freeze catcher 線程(可選)
工程g3dlite:游戲邏輯層的底層庫(kù)
工程framework:系統(tǒng)框架
工程realm
負(fù)責(zé)登陸和選擇游戲服務(wù)器,進(jìn)行負(fù)載均衡。用到了C++ Sockets Library進(jìn)行登錄處理,采用select I/O模型。實(shí)現(xiàn)了Wow, Mangos登錄時(shí)的SRP6認(rèn)證。客戶端作為它的client連接到realm server認(rèn)證和選擇了mangos server就斷開。 而mangos server和realm server則不進(jìn)行連接,只是通過數(shù)據(jù)庫(kù)交互數(shù)據(jù):mangos server把自己的狀態(tài)和擁有的角色數(shù)放入庫(kù)中。realm server會(huì)讀取數(shù)據(jù)庫(kù)中的這些信息來獲知mangos server的狀態(tài)。
- 數(shù)據(jù)庫(kù)realm的realmlist表保存了realm的列表
- realm通過如下事件處理函數(shù)來負(fù)責(zé)登陸和選擇游戲服務(wù)器。
const AuthHandler table[] =
{
{ AUTH_LOGON_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleLogonChallenge },
{ AUTH_LOGON_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleLogonProof },
{ AUTH_RECONNECT_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleReconnectChallenge},
{ AUTH_RECONNECT_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleReconnectProof },
{ REALM_LIST, STATUS_AUTHED, &AuthSocket::_HandleRealmList },
{ XFER_ACCEPT, STATUS_CONNECTED, &AuthSocket::_HandleXferAccept },
{ XFER_RESUME, STATUS_CONNECTED, &AuthSocket::_HandleXferResume },
{ XFER_CANCEL, STATUS_CONNECTED, &AuthSocket::_HandleXferCancel }
};
登錄處理:
user登錄到realm server進(jìn)行身份認(rèn)證,并選擇登錄上哪個(gè)mangos server。user登錄到mangos server后,將不再和realm server交互。
參考: Wow 服務(wù)器解析