?1.概述
loginserver?<----->?gameserver
服務端主體分為loginserver和gameserver,?loginserver做帳戶認證,?gameserver做遊戲主邏輯,
中間也可以加乙個charserver啦,?做人物管理,?新建刪除人物之類的,?也可以並到gameserver一
起,?loginserver和charserver都比較簡單,?略過.
通過loginserver的驗證後將分配給client乙個sessionid,?然後與gameserver或charserver的通訊,
都以此sessionid為認證碼.?client只有傳送正確的sessionid才能與gameserver建立連線.
2.gameserver層次結構
gameserver分為三層,?網路層<--->邏輯處理層<--->資料庫層
每層都有乙個訊息處理佇列,?存放待處理的訊息.?訊息佇列可以採用先進先出佇列的方式,?也可以
採用堆或者優先佇列的方式,?按優先順序對待處理訊息進行簡單的排序,?嘿嘿,?是不是有點類似qos
的思想.
每層採用執行緒池技術,?預先建立一定數量的空閒執行緒,??不夠時建立新執行緒,?過多時則銷毀執行緒,?
保證執行緒池中有指定數量的空閒執行緒(min/max),?主線程不斷檢查處理佇列是否有待處理訊息,?若
有則從執行緒池中分配一空閒執行緒處理之.
偶在linux下執行緒池是用pthread_cond_wait和pthread_cond_signal實現的.
2.1.網路層
本層根據作業系統不同可以有多種實現,?主要功能是與客戶端建立tcp連線,?將tcp流分割成乙個個封包,
如果有加密就解密,?如果有壓縮就解壓縮,?加入事務層的處理佇列,?同時把處理佇列中待傳送的訊息發
送出去,?如果要加密就加密,?如果要壓縮就壓縮.
windows下採用iocp模型,?unix-like系統下可採用select/poll(epoll)/kqueue
偶在偶的服務端中採用了select方式,?linux單個埠的連線數有限制,?所以偶開了多個執行緒監聽一組埠,?
由loginserver做負載均衡,?從而保證不會出現某個埠連線數過多的情況.?每當有新客戶端要登入時,?
loginserver判斷每個埠的連線數量,?選最小傳送給客戶端.?偶想這裡也可以做成動態方式,
當每個埠平均連線數超過***x時,?就開新執行緒監聽新埠,?並通知loginserver.
2.2.邏輯處理層
本層是gameserver的核心.?
根據操作碼(opcode)把訊息分配到每個子模組裡面處理.?最簡單的方法就是用從0開始的連續的opcode,?建立
乙個與opcode對應的處理函式的陣列,?opcode作為陣列的下標,?這樣只需要o(1)的時間就可以呼叫到所需的函式
連hash都省了,?又簡單又高效.
子模組詳見第7部分
2.3.資料庫層
本層用於資料儲存,?本質上就是把記憶體裡的資料存到硬碟上,?要是你夠拽的話,?可以不用現有的資料庫,?
自己寫演算法儲存文字檔案,?但為了方便起見,?也為了提高效率,?還是用資料庫比較好.
windows下用mssql,?或者用mysql,?
unix-like系統下可以用的就多了,?能多相容幾種資料庫最好
mysql的效能優異,?功能上稍差一點,?如果不需要用到儲存過程的話,?mysql還是首選的.
資料庫層一般用單執行緒已經足夠,?可以不需要做物件互斥,?程式設計方面也會簡單一點.?但是需要注意的是,?
資料庫操作方面一定要用transaction,?可以有效防止複製現象發生,?比如:交易操作一旦發生錯誤,?則
rollback到交易之前,?不會發生錢已交出,?東西卻沒拿到的情況.
3.訊息格式定義
3.1.網路層<-->邏輯層訊息格式(網路封包格式)
3.2.邏輯層<-->資料庫層訊息格式
4.遊戲物件定義(object)
object?
??|------->?item
??|???????????|---->?container(容器類物件,如倉庫、揹包等)
??|??|------->?unit?
??|???????????|----->?player
??|???????????|----->?monster
??|???????????|----->?npc
??|???????????|----->?corpse(屍體物件)
??|??|------->?gameobj?
??????????????|----->?dynamicobj(如技能產生的臨時物件)
??5.地圖場景管理
6.指令碼系統
7.邏輯層模組化設計
生產者消費者模型在大資料量處理中的應用
生產者消費者模型是經典的程序/執行緒協同處理模型,在現實中也有很大量的應用。而在c/s或b/s模式的客戶端和伺服器互動的應用中卻少見。其實在這種應用中如果存在大資料量的處理,使用這種模型也能帶來較大的效能提公升。
生產者消費者模型原型如下:
其實是乙個很簡單的模型,生產者不停的往佇列裡生產item,如果佇列滿了則停止生產,直到有空位,消費者不停地從佇列裡取走item,隊列為空則等待,這樣直到整個任務處理完成,佇列管理元件負責佇列的管理。整個處理過程中生產者和消費者可以並行處理各自的工作任務。
對於c/s或b/s模式中的大資料量的處理,通常都是通過分批處理來完成,通常是採用序列處理方式,客戶端迴圈分批傳送請求,如果資料還需要分別在服務端和客戶端做一些處理時,則客戶端和服務端都需要等待,造成資源不能充分利用,而如果採用生產者消費者模式,客戶端和服務端可以並行處理,即使是在網路傳輸時客戶端和服務端都可以作各自的處理,通過這種模式可以較大的提高整個任務的處理效能,通常實際應用中的c/s(b/s)模式的生產者消費者模型圖如下:
總的來說客戶端是消費者,服務端是生產者,客戶端可以採用輪循的模式向服務端請求消費,服務端有乙個客戶端消費者服務充當客戶端消費者**的作用,向服務端生產者佇列中取資料。而對於客戶端的輪循元件來說,即充當生產者也充當消費者,對服務端來說是消費者,對客戶端的處理來說又是生產者。這樣就組成了乙個多級生產者消費者模式,盡量使各部分能夠並行處理,從而提高整體任務的處理效能,但這個過程中也需要考慮管理成本,對於一些本身處理不是很耗時的操作採用這個模型可能並不會帶來明顯效果,而對於一些相對複雜和耗時的操作,採用這個模型將帶來明顯的效果,畢竟客戶端、網路和服務端都可以並行地得到充分的利用。
高階結構設計
1.軟體設計引論 2.結構化設計 3.物件導向設計 物件導向設計方法的特點 通過對實際問題的分析,從中抽象出物件,再使用程式語言來表現它 物件導向設計方法的過程 識別物件中的子物件,並識別出對於子物件的操作,然後再根據子物件的操作開發出乙個系統 結構化設計和物件導向設計共有特性 1.將乙個系統分解成...
迴圈結構設計
c語言有2種常用的迴圈結構,分別是for迴圈和while迴圈。其中while迴圈使用的頻率相對較多,下面我們先看for迴圈。for迴圈 for 這是乙個死迴圈,何為死迴圈,就是永不停止的迴圈。比如for 分割線 int i for i 0 i 10 i 該語句表示,迴圈列印10次hello worl...
選擇結構設計
一 選擇結構和條件判斷。1 用if語句實現選擇結構 例 輸出三個數,將其按從大到小排列輸出。在這裡插入 片 include int main if a c if b c printf a d,b d,c d n a,b,c 解釋 定義三個數a,b,c用來比大小 用if語句作為判斷,滿足該條件就執行裡...