• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            本文小弟淺談,新手看,老手拍磚,轉(zhuǎn)載請注明出處http://www.shnenglu.com/ziyebuboka/

                游戲服務(wù)器在網(wǎng)游上的作用不容考慮,游戲能做大到什么程度,還是有很大的依靠的,這篇文章先從功能模塊的角度來談一個(gè)完善的游戲服務(wù)器需要實(shí)現(xiàn)哪。
                一:游戲服務(wù)器的作用:連接各個(gè)網(wǎng)游客戶端,實(shí)現(xiàn)各客戶端的通信,連接,數(shù)據(jù)操作
                二:先從大分類上來:游戲服務(wù)器按一般架構(gòu)來說具備1
                        1:登陸驗(yàn)證注冊和賬號有關(guān)的所有操作的服務(wù)器  我們簡稱他為registerserver
                        2:游戲邏輯操作服務(wù)器 我們簡稱他為gameserver
                        不用細(xì)說大家也明白了,說一個(gè)玩家登陸進(jìn)入游戲世界的流程:玩家打開游戲客戶端(這之前會(huì)有更新操作,不過這只是連接更新服務(wù)器的一個(gè)文件比對和下載過程,我們不將他列為游戲服務(wù)器之內(nèi))說到這里朋友會(huì)發(fā)現(xiàn)游戲登陸上目前有兩大類,一類是先選服務(wù)器后輸入賬號 一類是先輸入賬號后選服務(wù)器,這里說下區(qū)別
            先選服務(wù)器后輸入賬號的一般來說都是將registerserver和gameserver配對,就是你先選擇服務(wù)器,而后你連接上的就是此服務(wù)器的registerserver,通過此registerserver來進(jìn)行賬號驗(yàn)證等等。另一類先輸入賬號的,無非是先制定一個(gè)中心registerserver(或者是隨機(jī)一個(gè),因?yàn)閞egister有時(shí)候會(huì)弄好多個(gè)由運(yùn)維配置來做動(dòng)態(tài)均衡),賬號驗(yàn)證成功后再顯示服務(wù)器列表,然后玩家選擇了服務(wù)器后,則從指定服registerserver去數(shù)據(jù)庫查詢玩家此服的角色列表(當(dāng)然了,這里如果非有人的服務(wù)器是做成查詢角色列表就從gameserver走的流程,我也沒意見)。返回后,客戶端進(jìn)入角色選擇界面,客戶端與registerserver斷鏈,玩家選擇角色,與gameserver連接,去數(shù)據(jù)庫提取角色,注冊進(jìn)入游戲服游戲世界,反饋角色信息給客戶端,客戶端進(jìn)入游戲世界。然后消息發(fā)送過來發(fā)送過去的開始了。。。。。。
                        上面說的是針對一個(gè)普通的一對一架構(gòu)的服務(wù)器所有的一個(gè)登陸流程,看到這里,朋友們應(yīng)該對registerserver和gameserver的基本功能有所了解了。一個(gè)是登陸驗(yàn)證用(垃圾點(diǎn)的小公司沒有注冊賬號的主頁的話也會(huì)通過這個(gè)在游戲里直接注冊賬號。。。)到登陸進(jìn)入游戲世界的過程。
                         再稍微高級點(diǎn)的就是加個(gè)聊天服務(wù)器了,因?yàn)榱奶爝@個(gè)功能實(shí)在是太耗性能了,特別那啥的那公聊,你發(fā)個(gè)一句,服務(wù)器得有多少人就發(fā)多少回。。。
             打個(gè)比方你發(fā)一句話 50個(gè)字那就是100 一個(gè)服有那么個(gè)幾K人的話,就打比方5K人 一句話發(fā)送就得是一個(gè)全服人口大FOR循環(huán),網(wǎng)絡(luò)還得消耗掉5000*100字節(jié)
            所以你看各游戲公聊國聊那啥的都時(shí)間限制要不就收費(fèi),他扛不住啊。
                         所以這個(gè)地方就出來個(gè)性能優(yōu)化方案了,加個(gè)聊天服務(wù)器,也就是玩家在登陸成功與gameserver連接成功的同時(shí)要與聊天服務(wù)器連接成功,聊天服務(wù)器有個(gè)全服在線角色表,一個(gè)大FOR循環(huán)和那啥的5000*100就讓他來發(fā)吧,至少對gameserver沒影響了。
                         好了,一個(gè)普通服務(wù)器的基本介紹就說到這里,讀者也應(yīng)該有個(gè)基本了解了,具體架構(gòu)上的就不細(xì)說了,趕明換個(gè)帖子發(fā)。這里還是接標(biāo)題從功能上來分析服務(wù)器。
                        這里就只分析游戲服務(wù)器了,registerserver就不考慮了。
                        一個(gè)游戲服務(wù)器他的作用在與,所有的游戲數(shù)據(jù)操作都將在這里完成,我們將只將客戶端作為顯示和一個(gè)數(shù)據(jù)的完善緩存。一切的操作都必須在游戲服務(wù)器的驗(yàn)證之后才能完成。
                       功能模塊分類(本人之間,有多余或遺漏的,歡迎補(bǔ)充):
                          1:腳本模塊
                          2:屬性模塊
                          3:網(wǎng)絡(luò)模塊
                          4:數(shù)據(jù)庫模塊
                          5:日志模塊
            以上所列的為一個(gè)完善的游戲服務(wù)器所必須實(shí)現(xiàn)的功能 下面一一來說
            1:腳本模塊
                  沒有腳本模塊,腳本策劃就得喝西北風(fēng),LUA首選很不錯(cuò)。
                  具體LUA的學(xué)習(xí),推薦LUA程序設(shè)計(jì),這玩意不用深究,會(huì)即可。
                  程序員要寫好幾個(gè)CPP,完成的功能是---》在C++中任意的調(diào)用LUA函數(shù)(或是執(zhí)行一個(gè)LUA文件),在LUA中任意調(diào)用你提供給腳本策劃的C++函數(shù)接口,如此功能實(shí)現(xiàn)后,哈哈,程序員們,你們的工作負(fù)擔(dān)就輕了,很大一部分的邏輯編程將交給策劃們?nèi)ネ瓿闪?br>     舉例:程序?qū)崿F(xiàn)一個(gè)接口例如 say(LPCSTR szSay)  ,則策劃可調(diào)用此接口 function  mySay()  say("歡迎來到游戲世界") end,就可
                可用到的地方:具體物品的使用邏輯,特殊任務(wù)的邏輯,活動(dòng)邏輯,特殊NPC邏輯等等等等,只要你愿意,跑步都可用LUA來
                 比如C++里可實(shí)現(xiàn)一籃子接口:AddItem 增加個(gè)物品  ChangeMap 跳地圖 甚至是AddLevel等等 而由LUA調(diào)用此類接口,而后就是C++里做些操作,比如玩家點(diǎn)擊物品就是調(diào)用相應(yīng)物品的腳本:例:點(diǎn)擊 血瓶 調(diào)用 LUA 的血瓶腳本,執(zhí)行LUA函數(shù)調(diào)用AddHp
                 腳本模塊很重要,可極大的方便工作,還有調(diào)試和維護(hù),因?yàn)樾薷哪_本,服務(wù)器是不用重編譯的,則意味著可在調(diào)試中隨意修改,甚至可在運(yùn)營過程中隨意修改某物品功能 某任務(wù) 某活動(dòng)。。。,只需C++到LUA,把這個(gè)LUA函數(shù)RELOAD下即可
                 具體的游戲應(yīng)用腳本的例子 大家網(wǎng)上找找吧 一坨子開源的。
            2:屬性模塊:呵呵,不知道我取這個(gè)名字OK不OK,我也覺得不是很合適,大家又更好的命名沒?
                 NPC的基本屬性配置,物品的基本屬性配置,叫屬性配置可能更合適點(diǎn),意思就是你要提供一個(gè)模塊供策劃可填入各個(gè)屬性配置,甚至是GUI的配置又或者是任務(wù)配置。對于這個(gè),我推薦使用EXCEL表格。
                例如:NPC的表格至少包括  NPC名字  模型編號   血量    藍(lán)量   移動(dòng)速度    AI  等等,而后有策劃往里面隨意填配置 這里比如AI就是一個(gè)對應(yīng)的腳本文件
                 這個(gè)讀取表格由程序員實(shí)現(xiàn),功能是要求要自由化,不然的話 策劃加一條 你咋辦,不至于從讀取開始你的代碼都得改吧,肯定能做到直接在NPCPROPERTY結(jié)構(gòu)體里直接加一條和表格新加的對應(yīng)就OK了。
               如果OK得話,最好再提供個(gè)編輯工具給策劃,任務(wù)的相同模式也可由此來實(shí)現(xiàn):任務(wù)描述  任務(wù)要求 對話1  對話2  對話3  獎(jiǎng)勵(lì)1 獎(jiǎng)勵(lì)2 獎(jiǎng)勵(lì)3
               物品:物品名字 模型編號 職業(yè)   等級   攻擊  腳本  
               不然你總不至于傻到認(rèn)為這些都是寫代碼里的吧。也可能有人想使用XML  隨便了 不過我這里不想用XML 為啥  EXCEL清晰啊 就一行條目
                這個(gè)模塊是數(shù)值策劃 任務(wù)策劃的天下
            3:網(wǎng)絡(luò)??欤哼@個(gè)沒啥好說的  一個(gè)基本功能,游戲世界都是在這之上也能成型,做好鏈接維護(hù),收發(fā)消息
            4:數(shù)據(jù)庫模塊:對數(shù)據(jù)的保存 其實(shí)這里我熱衷于使用工廠模式,本地調(diào)試服務(wù)器具體邏輯用本地文檔方式,上測試服上外網(wǎng)則用數(shù)據(jù)庫,所以這里叫數(shù)據(jù)操作模塊比較妥當(dāng)點(diǎn),就是玩家保存數(shù)據(jù),保存幫派啦 等等世界信息的具體操作,這個(gè)很重要
            5:日志模塊:我將此日志模塊分為兩大類,一類是游戲服務(wù)器調(diào)試維護(hù)用日志,一類是游戲運(yùn)營用日志,可選擇使用本地文檔或是數(shù)據(jù)庫模式記錄
                調(diào)試維護(hù)日志沒啥好說的,運(yùn)營日志說說,是給客服提供的,誰消費(fèi)了什么 交易流向 物品流向 等等的記錄 GM操作的記錄等等 比如萬一某玩家裝備被盜了,則可通過此來證明。

             接著一繼續(xù),其實(shí)寫本文從內(nèi)行技術(shù)角度來看,本身就沒什么技術(shù)含量,但是俗話說的好,隔行隔山,內(nèi)行看門道,外行那啥什么,反正就是想觸碰這玩意,但是又沒搞過的人看的。反正都是隨便亂寫了,愛看的看,準(zhǔn)備寫個(gè)功能模塊大概 再寫個(gè)架構(gòu)得大概,而后就去從網(wǎng)絡(luò)包開始搞個(gè)最簡單最輕量的小架構(gòu),力圖讓知道編程是啥的就能在上面搞東西
                  還是繼續(xù)談功能模塊。
                  一、還有個(gè)  AI模塊,這個(gè)可不能忘啊
                  不過要注意,我這里提到的AI模塊和我一里面所提到的幾個(gè)AI地方說指AI不是一會(huì)事情。
                  這里的AI模塊,哈哈,就是所謂的算法了,算法達(dá)人們NB的地方了。
                  針對NPC怪物等,比如最基本的尋路算法。
                  此模塊達(dá)到的效果是什么呢,就是:怪物死了又活,怪物看見你知道追你,怪物知道打你 都知道尋路躲障礙
                  介紹下最基本的A*算法吧 什么A B C D E F D的
                  怪物要打你 得追你,但是他為啥知道跟你走呢,或者說你點(diǎn)擊一個(gè)地方,為啥就能自動(dòng)走過去,能自動(dòng)的繞開障礙呢。這個(gè)模塊就是實(shí)現(xiàn)這些基本的東西。
                  2D的一般都是按格子計(jì)算,就說2D了,還有用像素玩的,3D玩坐標(biāo)的,等等 其實(shí)都是一會(huì)事情
                  角色身旁一共有8個(gè)格子,你點(diǎn)擊一個(gè)地方,就等于是指明了一個(gè)方向,角色就找到正對方向的身旁最近格子,判斷此格子是否有阻擋,如果無則走過去,如果有阻擋則搜索身旁另一個(gè)格子,然后就是這么一直遞歸,知道到達(dá)終點(diǎn)格子。
                 基本的自動(dòng)尋路算法就是上面這么一段話,當(dāng)然實(shí)際操作中,肯定不會(huì)用這么費(fèi)效率的算法了,這里就是簡單介紹下這個(gè)活在N-》B之前的N-》A*算法。。NA啊。具體的大家可以去找本人工智能的書看看
                 服務(wù)器要算一下怪物走哪了就給周圍玩家同步下消息,所以服務(wù)器需要這玩意,這理由充分吧、、、
                 客戶端也需要,給玩家或者寵物自動(dòng)尋路,內(nèi)掛使用。
                為什么我說這里的AI和我在一里面說的不同呢,是因?yàn)檫@里是實(shí)行基本的自動(dòng)功能,而后你可以在這個(gè)模塊的基礎(chǔ)上發(fā)展高級AI智能,結(jié)合腳本,表格配置,活用技能。比如一個(gè)游戲里按檔次有白怪 藍(lán)怪  紫怪 BOSS
            白怪么就給他這一套最基本的會(huì)走路躲障礙會(huì)打人就可
            藍(lán)怪 稍微高級點(diǎn)了,在基本模塊上擴(kuò)展,程序里再實(shí)現(xiàn)血少到一定程度會(huì)逃跑 會(huì)喊同伙,

            以上兩種可根據(jù)屬性配置表格模塊根據(jù)怪物類型讀取到程序,程序根據(jù)類型判斷是否激活擴(kuò)展AI

            表格可如下:
            NPC名字  類型  

            紫怪  再高級點(diǎn) 定制AI,可在程序里預(yù)先定義一組高級AI,比如預(yù)先設(shè)想好的十種可能,打個(gè)比方,放A技能 放B技能 自動(dòng)加血等等 ,而后也可在表格配置,比如預(yù)先表格設(shè)定好一種怪物最多可有4個(gè)定制AI

            表格可如下:
            NPC名字  類型  定制AI1 定制AI2 定制AI3 定制AI4

            程序讀取到相應(yīng)類型而激活相應(yīng)模塊 或者此組AI 都用腳本預(yù)先寫好 也不錯(cuò) 這樣比寫死在程序里好

            BOSS  那就得完全特殊處理了不是,腳本發(fā)揮作用,完全腳本實(shí)現(xiàn)  程序事先一組接口,比如掉什么裝備接口,放技能的接口等等,LUA里面就狂寫吧,接口只要完善,寫成個(gè)WOW里的一樣也很OK

            表格可如下:
            NPC名字  類型  定制AI1 定制AI2 定制AI3 定制AI4  腳本AI

            像2D游戲 下FB BOSS不夠智能的話 玩家就知道卡BOSS 幾個(gè)玩家把BOSS圍一圈,讓外面的遠(yuǎn)程玩家打,格子上玩家又是不可重復(fù)的,BOSS就出不去 有仇恨系數(shù) 他又只想殺外面打他的玩家 導(dǎo)致就卡那里了,想打的玩家打不到 打的到的玩家又不想打。。。。。。。怎么辦呢,特殊AI處理,卡BOSS?系統(tǒng)判斷BOSS十秒不出手,就放大技能秒殺周圍的人。。。。
                 
            說到底,AI模塊就是最基本算法,程序定制,腳本定制,屬性表格配置再加腳本特殊化處理,基本就可達(dá)到需求了

            二:擴(kuò)展下前面說的數(shù)據(jù)庫模塊和日志模塊
                    這里大家要注意,在這類數(shù)據(jù)庫 和IO操作上 盡量使用別的線程來開,不要和主線程搞到一起
             按目前流行的架構(gòu),一般都是在服務(wù)器上多開線程開啟網(wǎng)絡(luò)接口,另外在專門單開代理程序,消息發(fā)送到數(shù)據(jù)代理,讓代理來實(shí)現(xiàn)數(shù)據(jù)操作。
                   日志模塊,本地調(diào)試么,就用文檔記錄,運(yùn)營日志,單開個(gè)代理吧,這個(gè)操作挺頻繁的,和登錄保存角色的代理放一起影響性能 而且每什么意思,畢竟這個(gè)異步互相是不關(guān)聯(lián)的  稍微提醒下就是 你要是做 物品流向的時(shí)候 切記不要所有物品都記啊 不然就SB了,這個(gè)流向日志 要是都記錄的話 那一天都不知道是多少萬條記錄了 萬?十萬?百萬?
               可以 表格配置:
              物品名字  物品ID  是否記錄日志    //后面其他列是其他屬性
            每次產(chǎn)生物品流向時(shí)候 比如買一個(gè)裝備到包里  交易一個(gè)裝備 等等
            if(pItemProperty->bCanSaveLog)
            {
            //sendmessagetologdb
            }  

            這樣你就記錄些珍貴物品就可

            按我的分類 我一般將代理分為 賬號代理  角色代理  游戲代理  日志代理  運(yùn)維控制器代理

            這里不一個(gè)個(gè)講了 放到后面說架構(gòu)的時(shí)候再說每個(gè)代理需要做的事情 
            一個(gè)宗旨是 分的細(xì) 每一個(gè)得壓力就小  但是要保證不要出現(xiàn)數(shù)據(jù)互交叉

            也見過某些項(xiàng)目 是沒有具體的數(shù)據(jù)操作代理的,直接是在服務(wù)器里直接操作,我個(gè)人認(rèn)為啊,能新開進(jìn)程 異步的 就開,沒必要給老板省錢,全部都壓一GAME上 扛不住啊,而且如果是分布式的話,你肯定得有一個(gè)統(tǒng)一的數(shù)據(jù)出口啊,不然的話。。我沒想過會(huì)怎樣,數(shù)據(jù)不統(tǒng)一?數(shù)據(jù)庫死鎖?

            三:運(yùn)維模塊
                 運(yùn)維分開就是運(yùn)營和維護(hù)。。  因?yàn)樗麄兪亲叩耐惶准軜?gòu),所以這里就放一起來說
                 首先說明他們的產(chǎn)生原因:不可能每一次服務(wù)器更新 或者再監(jiān)控服務(wù)器 維護(hù)過程 或者是提取某某文件日志  都是一個(gè)個(gè)遠(yuǎn)程硬件服務(wù)器吧 那樣的話 維護(hù)者工作效率就太低了
                 GM也不可能每一個(gè)服務(wù)器都登陸進(jìn)個(gè)客戶端開著吧。。所以這個(gè)模塊就產(chǎn)生了,對維護(hù)者是要實(shí)現(xiàn)他們的遠(yuǎn)程操作,對GM是要實(shí)現(xiàn)他們的線下操作。
                工具功能:可監(jiān)控 開啟  關(guān)閉服務(wù)器 可主動(dòng)推送更新文件 更新腳本 
                                   GM可線下操作基本命令,監(jiān)控聊天,賠償物品,發(fā)送游戲郵件等等。
                                   開發(fā)者可主動(dòng)提取調(diào)試日志記錄
                                   算帳的可主動(dòng)開后臺查看運(yùn)營日志記錄計(jì)算ARPU值,查看在線記錄,等等等等
            我現(xiàn)在是不推薦GM做線上操作的呢,就如同之前傳奇那樣的,都是在聊天框里輸入GM命令,我個(gè)人認(rèn)為內(nèi)部操作還是走后門的好 不要和玩家一起從前門走了,注意的是這一塊在中心控制器代理這里一定要做好監(jiān)控,和操作記錄,驗(yàn)證,來保證操作的安全性,防止違規(guī)操作。力圖將工具客戶端綁定到某一臺機(jī)器,比如可在運(yùn)維登陸工具時(shí)候 發(fā)送賬號 密碼  MACKEY  IP  子網(wǎng)掩碼   某一個(gè)CODE 等等在控制中心驗(yàn)證 成功才可登入控制中心,工具客戶端才可操作、
                 這個(gè)模塊主要注意的就是安全性,操作的方便,和日志模塊結(jié)合在一起,日志記錄 分類 挖掘 良好 


                具體架構(gòu)的后面再說
                畢竟這個(gè)就是淺談,所以沒有什么實(shí)際性的代碼內(nèi)容,就是讓不了解的朋友能夠了解這是怎樣的一個(gè)架構(gòu)一個(gè)工作流程
                看了留言啊 ,這博客,不同IP,點(diǎn)了就加一閱讀,沒意思啊,我不知道到底有沒有價(jià)值繼續(xù)啊,

                我是力圖用最淺的語言來表現(xiàn)這些玩意是怎么會(huì)事情,高深的我也不懂了,扁我吧,。覺得沒啥意思的也留個(gè)言拍下磚頭啊,覺得有意思的留個(gè)言讓我高興下,主要是沒打草稿直接寫的就發(fā)了,遺漏 不清不楚肯定還是有的 .

            本文介紹一下一個(gè)應(yīng)用的游戲服務(wù)器的架構(gòu)和演變
                  游戲服務(wù)器的作用在于滿足在線玩家的需求,實(shí)現(xiàn)賬號的驗(yàn)證,登陸,玩家在游戲世界的一系列邏輯操作和驗(yàn)證。在此基礎(chǔ)上,一個(gè)好的架構(gòu),可以提升效率,在實(shí)現(xiàn)邏輯需求的情況下達(dá)到百萬級的同時(shí)在線數(shù)也不是不可能。
                  我們先從最搓的最簡單的結(jié)構(gòu)看起
                  
                  CLIENT ----------  SERVER   ---------   DBSYSTEM

                  就是一個(gè)很簡單的 C/S系統(tǒng)  同一個(gè)server同時(shí)處理登陸注冊創(chuàng)建角色和游戲邏輯操作的功能,。在server上直接掛接DB操作。DB可以是一個(gè)具體的數(shù)據(jù)庫也可以是一個(gè)FILESYSTEM
                  這里可以看的出來,過于簡單了,將登陸注冊創(chuàng)建和具體邏輯這幾個(gè)毫無關(guān)系的東西放置于一起,嚴(yán)重?fù)p耗了具體邏輯操作的效率,特別是在新開服階段,完全會(huì)因?yàn)榈顷戲?yàn)證的操作而導(dǎo)致邏輯爆卡。
                  所以這里需要升級,將完全不同類型在玩家一次游戲操作工程中只會(huì)在登陸階段執(zhí)行一次的操作單獨(dú)分開,單獨(dú)進(jìn)程解決,。故而可成為下面階段
                   
                             -  LOGINSERVER -
                           -                                 -
            CLIENT -                                   -  DBSYSTEM
                           -                                -
                            - GAMESERVER -

            分為兩個(gè)服務(wù)器,這個(gè)我在一文章里的開頭就有提到過了。

            我們來看下好處進(jìn)階,在LOGINSERVER里只執(zhí)行賬號驗(yàn)證  查詢角色列表  創(chuàng)建角色的操作   而后玩家登陸進(jìn)GAMESERVER  具體邏輯操作在GAMESERVER里完成

            玩家的一次登陸操作

                               發(fā)送賬號                                 驗(yàn)證                               返回角色列表                          創(chuàng)建角色
            CLIENT---------------LOGINSERVER -----------DBSYSTEM-----------------------CLIENT ------------------
                                                                                                            選擇角色與LOGIN斷鏈與GAME連接 登陸
            LOGINSERVER -------DBSYSTEM  ----------CLIENT  ------------------------------------------------------GAMESERVER

            如此,可有效的提升效率,玩家的驗(yàn)證 列表讀取 創(chuàng)建 和GAME就毫無關(guān)系了,但是他的缺點(diǎn)任然存在 我們再繼續(xù)看可優(yōu)化的地方

            首先從數(shù)據(jù)庫上來提升效率(先說下,從這里開始就應(yīng)該是肯定的是用數(shù)據(jù)庫了,而非什么本地FILE了,),將賬號庫和游戲數(shù)據(jù)庫分開,分離為兩個(gè)獨(dú)立的庫,
            具體理由有兩個(gè):
            1:從游戲運(yùn)營上來說 你不可能一直是只有一個(gè)服吧? 分成多個(gè)服后 人數(shù)越來越多,就不能所有服都共用一個(gè)數(shù)據(jù)庫了吧?那你這數(shù)據(jù)庫也牛逼了
                  所以我們這里這么干,將 賬號庫獨(dú)立,全游戲共用,這樣是方便管理,方便管理賬號的全局性的信息 經(jīng)濟(jì)性的 比如點(diǎn)卡什么的,每個(gè)服一個(gè)游戲數(shù)據(jù)庫,只記錄操作你這個(gè)服的玩家信息,世界信息。
            2:理由類同將服務(wù)器拆分為LOGIN和GAME。

            現(xiàn)在 結(jié)構(gòu)就是這樣的

                               - LOGINSERVER-
                             -                               - ACCOUNTDBSYSTEM
             CLIENT -                                                             -   
                             -                               - GAMEDBSYSTEM 
                               - GAMESERVER -


            但是到了這里后 肯定還是不夠的,
            我們先說個(gè)基本的,在服務(wù)器里 ,你一定要記得,數(shù)據(jù)庫操作,IO操作 ,文本操作這些 一定要單獨(dú)進(jìn)程不要和主進(jìn)程搞一起,你總不希望你做了個(gè)什么查詢還是什么操作 他主線程掛起吧?但是,試想下,如果能單獨(dú)進(jìn)程肯定還是單獨(dú)進(jìn)程更爽一點(diǎn)吧?你還能在里面做做緩存啥的,還不占服務(wù)器的資源
                所以這里還是麻煩的 從效率上來說 至少后臺這塊 還有很大提升空間。因此,我們加入 DBAGENT模塊 ,單獨(dú)進(jìn)程,將數(shù)據(jù)庫操作單獨(dú)分離,并且可自我添加某些應(yīng)用的緩存

            對應(yīng)ACCOUNTDBSYSTEM 增加 accountagent ,對應(yīng) GAMEDBSYSTEM 增加 gameagent

            結(jié)構(gòu)如下


                             -LOGINSERVER-
                           -                              - accountagent - ACCOUNTDBSYSTEM
            CLIENT -                                                                                                   
                           -                              - gameagent   - GAMEDBSYSTEM 
                            -GAMESERVER -

            LOGINSERVER同時(shí)和accountagent和gameagent連接   gameserver也同時(shí)和這兩個(gè)連接   服務(wù)器通過agent來對對應(yīng)的數(shù)據(jù)庫做操作   因?yàn)閍ccountdbsystem可能是全服共有的 ,所以accountagent也可以是全服共有的 他連接所有的服務(wù)器。loginserver通過accountagent來驗(yàn)證 通過gameagent來查詢列表 創(chuàng)建角色  gameserver通過gameagent來查詢完整角色信息登陸進(jìn)game,并通知accountagent此賬號已進(jìn)入游戲,避免重復(fù)登陸。并且定期保存。設(shè)置你可以將比如你游戲的排行榜啊,拍賣行啊的信息放置于你自己設(shè)計(jì)的gameagent的緩存中,而避免重復(fù)查詢

            玩家每一個(gè)對數(shù)據(jù)庫的操作 server只需發(fā)送消息到agent agent來做具體操作,而后再返回到server 再到client就可。將數(shù)據(jù)操作完全的異步操作,效率有較大提升。并且安全性上也得到了些許保證。

            不是我胡說或者輕視,國內(nèi)一大半游戲,都用的上面這個(gè)結(jié)構(gòu)。。。。。。。。。。。。。。。。。。。。。這個(gè)可以算是一個(gè)比較完善的產(chǎn)品化架構(gòu)了。

            說到這里,大家有沒有發(fā)現(xiàn)一個(gè)共性。采用這類架構(gòu),游戲必然會(huì)是先選服務(wù)器再驗(yàn)證賬號 登陸進(jìn)游戲,這是因?yàn)榉?wù)端采用的是LOGIN和GAME一對一得處理,也就是你是登陸的什么服務(wù)器必然就是從什么服務(wù)器的LOGIN進(jìn)入驗(yàn)證,故而他需要在客戶端開啟的時(shí)候就要知道需要連接的是哪個(gè)LOGIN 賬號驗(yàn)證成功后再是哪個(gè)GAME
            其實(shí)這里很好處理,就在客戶端上做些處理就可以達(dá)到先登陸驗(yàn)證在選服務(wù)器。所以在配置上 LOGIN不再是一對一(后面會(huì)有優(yōu)化的再說到多個(gè)LOGIN),全局也共用一個(gè)LOGIN。玩家開啟客戶端,連接LOGIN。發(fā)送賬號驗(yàn)證。因?yàn)檫@里已經(jīng)是把ACCOUNTDBSYSTEM做成全局的了,所以是不用擔(dān)心他是哪個(gè)服的,然后返回成功,玩家客戶端顯示服務(wù)器列表(這個(gè)列表還有連接信息配置再客戶端就可以了)選擇某一個(gè)服后,則發(fā)送查詢某服角色列表的請求到LOGIN,而后再返回再登陸游戲就可。小小調(diào)整和改變就可實(shí)現(xiàn)先驗(yàn)證后選服務(wù)器了。

                  所以,到了這步,服務(wù)器架構(gòu)就變成這個(gè)樣子了


                              -LOGINSERVER-
                            -                               - accountagent -ACCOUNTDBSYSTEM
            CLIENT -                                 |--------                                           
                            -                                |-----------
                             - 
                              - GAMESERVER  - gameagent     -GAMEDBSYSTEM 
                                -                                             |  
                               - GAMESERVER  -gameagent      -GAMEDBSYSTEM 

            全局共用一個(gè)LOGIN和一個(gè)ACCOUNTAGENT還有ACCOUNTDBSYSTEM
            每個(gè)獨(dú)立服各自獨(dú)立的gameagent 和gamesdbystem
            但是LOGIN的瓶頸立馬出現(xiàn)了,當(dāng)初是一個(gè)服獨(dú)立一個(gè)LOGINSERVER 現(xiàn)在是全服只有一個(gè)了,毫無以為,扛不住。

            其實(shí)上面這個(gè)架構(gòu)的不一定非得存在的,就是隨便寫寫,讓大家更清楚一點(diǎn)。

            所以LOGINSERVER就得配置多個(gè)了。這個(gè)地方大家選擇吧 盡量靈活點(diǎn),可以全服單位的配置多個(gè)也可以每個(gè)服對應(yīng)的配置多個(gè)LOGINSERVER。這樣 在開服時(shí)候,這種大面積井噴式的玩家玩家上線,可有效解決負(fù)載。具體CLIENT開啟后會(huì)是和哪個(gè)LOGIN連接呢
            這里提供兩種方式。一個(gè)是配置上的 一個(gè)是程序上的
            1:
               程序上的好說 ,你把所有LOGINSERVER的連接信息都配置到客戶端,讓客戶端開啟后隨機(jī)選擇一個(gè)去連接。要是你開服后,他所有玩家都隨機(jī)到一個(gè)LOGINSERVER了,那真的算你點(diǎn)背。背到家了
            2:配置上 :
               通過基于DNS的負(fù)載均衡系統(tǒng),DNS中為一個(gè)域名配置多個(gè)IP地址。通過負(fù)載,讓系統(tǒng)來選擇是對應(yīng)到哪個(gè)IP

            所以就是     
                             -LOGINSERVER   -|

                             - LOGINSERVER  -|

                             -LOGINSERVER   -|
                            -                  -accountagent -ACCOUNTDBSYSTEM
            CLIENT -                                  |--------                                           
                            -                                 |-----------
                            - 
                            -GAMESERVER -gameagent   -GAMEDBSYSTEM 
                            -                                             |  
                            -GAMESERVER - gameagent  -GAMEDBSYSTEM 

            或者是:

                    

                    - LOGINSERVER   -             
                     - LOGINSERVER   -   
                     - LOGINSERVER   - 
                  ..................................上面可以是N個(gè)                                                                             
                    -                                -gameagent -GAMEDBSYSTEM 
                    -GAMESERVER  -

            Client
                   - LOGINSERVER   -      
                     - LOGINSERVER   -   
                     - LOGINSERVER   - 
                  ..................................上面可以是N個(gè)                                                                                            
                                                     - gameagent-GAMEDBSYSTEM 
                    - GAMESERVER  -

              accountagent    --              --- ACCOUNTDBSYSTEM 是全局的

            一個(gè)服對應(yīng)好多個(gè)LOGINSERVER


            因?yàn)長OGINSERVER使用的動(dòng)態(tài)配置,故而可在登陸下線沒有多大壓力的情況下,關(guān)掉幾個(gè)LOGINSERVER,節(jié)省運(yùn)維資源


            不想寫了,元旦又混了三天,明天繼續(xù)吧。明天把前面的再擴(kuò)展下,再說下分線的和分布的。牛逼的就不說了

            posted on 2010-01-31 12:10 chatler 閱讀(1530) 評論(1)  編輯 收藏 引用 所屬分類: misce 、Game

            FeedBack:
            # re: 淺談?dòng)螒蚍?wù)器---功能模塊上來看[未登錄]
            2010-02-02 14:08 | cppexplore
            不錯(cuò) 好文!! 期待博主繼續(xù)  回復(fù)  更多評論
              
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠综合久久综合中文88| 色综合久久天天综合| 久久亚洲色一区二区三区| 久久精品国产免费| av无码久久久久不卡免费网站| 久久精品久久久久观看99水蜜桃| 久久久久人妻一区精品| 久久本道综合久久伊人| 久久九九免费高清视频| 久久久久人妻精品一区三寸蜜桃| 国产真实乱对白精彩久久| 91久久香蕉国产熟女线看| 久久www免费人成精品香蕉| 国产真实乱对白精彩久久| 久久久久亚洲爆乳少妇无| 欧美精品福利视频一区二区三区久久久精品 | 久久天天躁狠狠躁夜夜2020| 日本久久久久久中文字幕| 国产高清国内精品福利99久久| 久久免费线看线看| 久久se精品一区二区影院 | 欧美va久久久噜噜噜久久| 一本色道久久综合狠狠躁| 亚洲va久久久噜噜噜久久| 久久精品人成免费| 久久免费小视频| 伊人 久久 精品| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 人妻系列无码专区久久五月天| 开心久久婷婷综合中文字幕| 99精品国产99久久久久久97| 国产精品久久久久影院嫩草| 精品久久久久久国产免费了| 99久久99久久精品国产片果冻 | 一级做a爰片久久毛片人呢| 久久久久久亚洲精品不卡| 久久久一本精品99久久精品88| 99国产欧美精品久久久蜜芽| 久久精品国产亚洲AV不卡| 蜜臀av性久久久久蜜臀aⅴ| 国产午夜福利精品久久|