• <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>
            OldJiang.com

            浩毛的博客

            OldJiang.com
            posts - 14, comments - 81, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                在游戲服務(wù)器中,處理玩家登陸需要向數(shù)據(jù)庫查詢玩家的賬號(hào)和密碼,玩家上線和下線需要對(duì)玩家的角色數(shù)據(jù)從數(shù)據(jù)庫中讀取和保存。可以說,相對(duì)于游戲邏輯處理來說,數(shù)據(jù)庫操作是一種相對(duì)很慢的操作,即便你通過使用多個(gè)線程多個(gè)數(shù)據(jù)庫連接來提高數(shù)據(jù)庫操作的處理能力,但是,在高并發(fā)高負(fù)載的服務(wù)器應(yīng)用中,這樣仍然會(huì)是相當(dāng)?shù)呢?fù)載瓶頸。設(shè)想這樣一種設(shè)計(jì)方案,見下圖:

                在大量玩家登陸游戲服務(wù)器時(shí),由于有大量的數(shù)據(jù)庫訪問請(qǐng)求,即便是有自己實(shí)現(xiàn)的CACHE機(jī)制,還是會(huì)導(dǎo)致服務(wù)器耗盡所有的邏輯線程資源,服務(wù)器的處理能力將降低成DBMS的處理能力。
                
                 為了不阻塞邏輯線程,可以采用異步數(shù)據(jù)庫訪問的方式,即數(shù)據(jù)庫操作請(qǐng)求提交給專門的數(shù)據(jù)庫處理線程池,然后邏輯線程不再等待數(shù)據(jù)庫處理結(jié)果,繼續(xù)處理其他,不再阻塞在這里。
                 抽象的來看,對(duì)于一個(gè)需要持久化的游戲?qū)ο髞碚f,可以考慮它有2個(gè)方法,讀取和保存。那么我們抽象一個(gè)DBO接口:
               

            struct IDbo
            {
                
            virtual bool SaveToDB(DB*)=0;
                
            virtual bool LoadFromDB(DB*)=0;
            }
            ;
               
                 然后把設(shè)計(jì)方案改成下面這種:

             

                 改成數(shù)據(jù)庫異步處理后,在想想現(xiàn)在的游戲數(shù)據(jù)的保存機(jī)制應(yīng)該是怎樣改進(jìn)的,為了保障數(shù)據(jù)安全,我們希望不只是玩家下線的時(shí)候才會(huì)保存玩家數(shù)據(jù),而是希望每隔一段時(shí)間統(tǒng)一保存所有在線玩家的數(shù)據(jù),那么,可以考慮這樣的思路:假設(shè)我們有一個(gè)GAMEDB服務(wù)器,GAMEDB緩存了所有在線玩家的角色數(shù)據(jù),每到保存時(shí)間,GAMEDB就將所有在線玩家的數(shù)據(jù)(DBO)的副本都統(tǒng)一提交給DB線程池,讓它保存數(shù)據(jù),提交的過程很快,提交完后,GAMEDB的邏輯線程仍能繼續(xù)處理游戲服務(wù)器的更新和讀取CACHE的請(qǐng)求。為什么要保存副本呢,DB線程的執(zhí)行保存隊(duì)列的過程也許很耗時(shí),但是隊(duì)列中的數(shù)據(jù)都是GAMEDB提交DBO那個(gè)時(shí)刻的數(shù)據(jù),這樣就能保證玩家的游戲數(shù)據(jù)的完整性。
                  當(dāng)然,我這里提的這只是個(gè)思路,這里面還有很多細(xì)節(jié)沒有討論,例如如果DB線程池正在保存九點(diǎn)鐘時(shí)刻保存的數(shù)據(jù),到了十點(diǎn)鐘新的保存時(shí)刻時(shí),DB線程池還沒保存完九點(diǎn)鐘時(shí)刻的DBO副本隊(duì)列,這時(shí)應(yīng)該怎么處理;DBO對(duì)象的劃分粒度的問題;DBO隊(duì)列的優(yōu)先級(jí)的問題等等。

                 PS:這篇文章里的架構(gòu)其實(shí)就是一個(gè)GAMEDB服務(wù)器,里面的邏輯處理就是GAMEDB的邏輯處理。你可以把這篇文章理解成:一個(gè)GAMEDB服務(wù)器 的實(shí)現(xiàn)思路。。。

            Feedback

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 13:38 by Kevin Lynx
            基本上不會(huì)有人在游戲邏輯線程里放置IO操作的代碼吧,包括網(wǎng)絡(luò)和DB。對(duì)于玩家的重要操作有時(shí)候需要立即存儲(chǔ)。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 15:46 by vivian1683
            http://blog.sina.com.cn/s/articlelist_1791090757_10_1.html

            我是獵頭vivian..大量職位IT在招聘中.如果有考慮的朋友請(qǐng)發(fā)簡歷到vivian1683@live.cn

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-08-30 20:56 by 球球
            問題是DB不定受得了

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄]  回復(fù)  更多評(píng)論   

            2010-08-31 09:37 by ZUHD
            說的太粗糙,沒看到啥有用的觀點(diǎn)啊,再細(xì)化下呢

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄]  回復(fù)  更多評(píng)論   

            2010-08-31 20:57 by vincent
            異步是一定的,包括db和io操作。而且在邏輯處理時(shí),并不能保證一定不處理db和io操作,總有些需要即時(shí)保存的東西

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-09-01 09:49 by RIC
            1 游戲的數(shù)據(jù)庫一般分 角色數(shù)據(jù)庫和賬號(hào)數(shù)據(jù)庫
            2 賬號(hào)數(shù)據(jù)庫一般與平臺(tái)綁定,通常情況下不會(huì)提供給你訪問賬號(hào)數(shù)據(jù)庫的權(quán)限,而只會(huì)給你提供驗(yàn)證接口.
            3 角色數(shù)據(jù)庫也不是通常意義的直接從數(shù)據(jù)庫中讀,通常會(huì)有個(gè)緩沖,這個(gè)緩沖會(huì)動(dòng)態(tài)調(diào)整保存活躍度較高的玩家數(shù)據(jù)
            4 3中的緩沖通常由角色服務(wù)器來提供這樣的功能
            5 根據(jù)我的經(jīng)驗(yàn),邏輯相關(guān)網(wǎng)絡(luò)消息派發(fā)包很少有做多線程,無論是何種服務(wù)器,網(wǎng)絡(luò)底層可以這么做.
            7 其實(shí)數(shù)據(jù)庫服務(wù)器很簡單,個(gè)人覺得不用這么麻煩的,看起來很高檔很合理的做法.
            8 個(gè)人意見,僅供參考.
            (PS.我從事網(wǎng)絡(luò)游戲研發(fā)約5年,相對(duì)比較熟悉完成1個(gè)服務(wù)器構(gòu)架所需要的方方面面,另外,客戶端略懂)

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-09-05 11:58 by 浩毛
            @RIC
            我覺得可能我的說法有些誤導(dǎo)大家,這篇文章里的架構(gòu)其實(shí)就是一個(gè)GAMEDB服務(wù)器,里面的邏輯處理就是GAMEDB的邏輯處理。你可以把這篇文章理解成:一個(gè)GAMEDB服務(wù)器 的實(shí)現(xiàn)思路。。。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制[未登錄]  回復(fù)  更多評(píng)論   

            2010-11-26 17:19 by 123
            這類只讀的異步操作其實(shí)是很好處理的了,
            游戲里比較糾結(jié)的DB操作是:A、B兩個(gè)模塊同時(shí)發(fā)起對(duì)某個(gè)對(duì)象的保存或讀取,這樣很難保證新存的數(shù)據(jù)被舊的覆蓋或者讀取到得不是最新數(shù)據(jù)。
            如果序列化這些操作,又失去了異步的意義。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2010-12-28 23:55 by 浩毛
            @123
            我認(rèn)為很好解決,
            比如一個(gè)角色A

            在10:30:03的時(shí)候,角色A的內(nèi)存數(shù)據(jù)被復(fù)制出來,提交給異步數(shù)據(jù)庫線程池,請(qǐng)求執(zhí)行數(shù)據(jù)庫寫操作。

            10:30:04 角色A修改了內(nèi)存數(shù)據(jù)

            10:30:05 數(shù)據(jù)庫寫操作完成。數(shù)據(jù)庫最新數(shù)據(jù)是0:30:03的時(shí)候的

            11:00 玩家下線,角色A的數(shù)據(jù)再被復(fù)制出來,提交給異步數(shù)據(jù)庫線程池,請(qǐng)求執(zhí)行。。。


            。。。。提交的的數(shù)據(jù)庫操作的數(shù)據(jù),一定要復(fù)制新的一份。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2011-03-24 16:39 by J
            當(dāng)你的邏輯需要DB返回?cái)?shù)據(jù),你的異步DB操作怎么保證下面的邏輯操作繼續(xù)工作?沒有數(shù)據(jù)啊?

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2012-03-18 13:14 by QQ462624080隔夜壽局
            2011-03-24 16:39 by J
            當(dāng)你的邏輯需要DB返回?cái)?shù)據(jù),你的異步DB操作怎么保證下面的邏輯操作繼續(xù)工作?沒有數(shù)據(jù)啊?
            ------------------
            回復(fù)J:異步讀取數(shù)據(jù),函數(shù)邏輯不是連續(xù)的,要拆成兩個(gè)函數(shù)來完成,即是靠回調(diào)的。請(qǐng)求時(shí)會(huì)把一個(gè)id與sql請(qǐng)求發(fā)到db,并把id與函數(shù)指針關(guān)聯(lián)起來。db返回時(shí)會(huì)返回id與數(shù)據(jù),根據(jù)db返回的id找到之前關(guān)聯(lián)的相應(yīng)的函數(shù)指針,再調(diào)用之.
            這里所說的函數(shù)指針真正說法應(yīng)該是一個(gè)Functor,因?yàn)楸换卣{(diào)的函數(shù)中往往需要上一個(gè)函數(shù)中的參數(shù),Functor的作用就是把上一個(gè)函數(shù)的局部變量打包到回調(diào)函數(shù)中使用。

            # re: 游戲服務(wù)器中的數(shù)據(jù)庫異步操作技術(shù)和游戲數(shù)據(jù)的保存機(jī)制  回復(fù)  更多評(píng)論   

            2012-03-18 13:23 by QQ462624080隔夜壽司
            一個(gè)邏輯上的東西拆成2個(gè)函數(shù)來完成,確實(shí)代碼不美觀,不易閱讀。不過好在這部分邏輯較少。大部分?jǐn)?shù)據(jù)在玩家上線時(shí)已經(jīng)加載到GameServer內(nèi)存了。少數(shù)像玩家房屋之類的just in time的數(shù)據(jù)就需要做這樣的回調(diào)。不知道誰有更好的方法。歡迎交流
            OldJiang.com
            久久久久国产亚洲AV麻豆| 国产精品9999久久久久| 精品久久久久久国产三级| 亚洲天堂久久精品| 色99久久久久高潮综合影院| 久久亚洲国产成人影院| 久久青青草原精品国产| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 久久狠狠爱亚洲综合影院| 久久人人爽人人爽人人片AV不| 国产亚洲精久久久久久无码| AAA级久久久精品无码区| 久久久久久精品免费看SSS| 99久久国产综合精品麻豆| 久久黄色视频| 久久精品国产亚洲AV无码麻豆| 激情五月综合综合久久69| 亚洲国产精品无码久久98| 国产毛片久久久久久国产毛片| 无码精品久久久久久人妻中字 | 日韩人妻无码一区二区三区久久| 精品国产VA久久久久久久冰 | 久久久91人妻无码精品蜜桃HD| 久久人人爽人人爽人人片AV高清 | 亚洲AV无码久久寂寞少妇| 久久久久久国产精品无码下载| 精品久久久久久久久午夜福利| 久久天天婷婷五月俺也去| 国产一区二区精品久久凹凸| 精品永久久福利一区二区| 日产精品久久久一区二区| 欧美成人免费观看久久| 久久综合久久鬼色| 久久av免费天堂小草播放| 国内精品久久久久久中文字幕| 国产成人精品久久免费动漫| 久久影院综合精品| 久久99热只有频精品8| 久久久久久综合网天天| 久久久亚洲AV波多野结衣| 中文精品久久久久人妻|