依據傳奇遊戲伺服器原始碼總結了一下伺服器開發中比較關心的一些問題。
(1)執行緒之間的共享資料如何同步
cintlock封裝了臨界區管理,包含了lock()和unlock()兩個操作函式,所有
需要同步的類都從cintlock派生,例如:cwhqueue,cdbmanager,cglobaluserlist,cuserinfo,cplayerobject
(2)資料庫是如何管理和連線的
資料庫伺服器dbsvr採用odbc進行資料庫連線,cconnection,cdatabase,crecordset,cdbmanager等類實現對資料庫的管理,這幾個類
對odbc sdk進行了封裝。
dbsvr.cpp:資料庫連線採用一次連線多次使用的方式,在應用程式初始化函式initinstance中,
getdbmanager()->init( insertlogmsg, szdatabase, "sa", "prg" );
進行資料庫的連線。
(3)玩家處理執行緒processuserhuman主要完成什麼工作
gamesvr\processuserhuman.cpp
processuserhuman執行緒主要負責處理玩家的遊戲動作以及資料的傳送
puserinfo->operate(); // 執行玩家遊戲動作
pgateinfo->xsend(); // 傳送資料
(4)資料如何傳送
在acceptex接受連線後,將套接字傳送緩衝設定為0,
int zero = 0;
setsockopt(pgateinfo->sock, sol_socket, so_sndbuf, (char *)&zero, sizeof(zero) );
需要傳送的資料通過m_puserinfo->m_pgateinfo->m_xsendbuffq.pushq((byte *)lpsendbuff);
放入傳送佇列。由processuserhuman執行緒中迴圈呼叫pgateinfo->xsend();進行傳送。
因為傳送緩衝已設定為0,那麼接下去在pgateinfo->xsend()中呼叫wsasend將被阻塞,processuserhuman執行緒中呼叫所有pgateinfo的xsend(), 資料將被順序傳送出去。
(5)cgateinfo有什麼作用,物件是在**分配的
cgateinfo用於管理資料收發,包含於cuserinfo物件中。
gamesvr\sockmsg_gatecomm.cpp
acceptthread中分配cgateinfo物件,並加入到全域性列表中
cgateinfo* pgateinfo = new cgateinfo;
if (pgateinfo)
(11)如何處理玩家遊戲資料
在serverworkerthread中解包操作完成後,如果資料型別是gm_data型別,呼叫puserinfo->processusermessage
處理玩家遊戲資料,呼叫m_pxplayerobject->addprocess,在addprocess中分配processmsg物件,並將資料複製到
該物件中,然後push到m_processq佇列中待處理。processuserhuman執行緒中遍歷列表中的所有使用者,呼叫
puserinfo->operate(),在cplayerobject::operate中從m_processq中pop出遊戲動作進行處理。
#re: 傳奇遊戲伺服器原始碼學習 gaoqing000
posted @ 2007-12-12 09:29
puserinfo->operate(); // 執行玩家遊戲動作
這是怎麼一回事啊 fastzhao
posted @ 2007-12-14 16:55
覺得傳奇的伺服器設計的比較爛,傳送竟然用阻塞的!萬一傳送網路阻塞,那不就卡住了嗎!
還有就是個iocp框架。沒什麼深奧的東西。 diviner
posted @ 2007-12-16 11:49
to:fastzhao
傳奇的伺服器版本有幾個版本,最早人家是用delphi版本寫的,後來國內一家公司改用c++實現了一下,但錯誤比較多。但畢竟實現了。
好像不是堵塞的。
iocp框架要寫得好,也不見得多麼容易。
私服小白,怎麼選擇傳奇遊戲伺服器?
一般我們常規的主要是線路支援,比如說單線路,雙線路,bgp線路等等,這裡簡單說明bgp線路是什麼。bgp線路是乙個ip的伺服器,然後支援個個線路的訪問,以電信網通移動為主。單線路一般是 電信單線乙個ip,雙線是電信 網通兩個ip bgp 是支援電信網通移動 乙個ip 針對頻寬也有需求,看您玩家多少,...
mysql 做遊戲伺服器配置 遊戲伺服器部署
bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...
mysql遊戲伺服器快取 遊戲伺服器快取策略
1 什麼是快取 在資料庫與伺服器邏輯之間加入的資料層 2 作用 減少資料庫操作 伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。3 erlang的快取 erlang 在記憶體中可用 程序字典 gen state ets 儲存變數,理論上三種方式都可以作為...