青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程

 老手拍磚。轉(zhuǎn)載請注明  ziyebuboka    http://www.shnenglu.com/ziyebuboka/
        總所周知,要想服務(wù)器的高效率實現(xiàn),那么多線程是不可避免的,但是游戲服務(wù)器的多玩家交互的特殊性又使得在邏輯層實現(xiàn)多線程成為了安全瓶頸,以往的架構(gòu)也是只有通過結(jié)構(gòu)功能的不同來實現(xiàn)多線程,比如 網(wǎng)絡(luò)層一個線程 邏輯層一個線程 等等,但是如此并不能有效的通過多線程方式來較好的實現(xiàn)服務(wù)器的高效處理。本文就是探討的如何通過結(jié)合游戲服務(wù)器的特殊性來異變當前主流的網(wǎng)絡(luò)包架構(gòu)模式從而實現(xiàn)服務(wù)端的多線程。
      先來看下主流網(wǎng)絡(luò)包的架構(gòu)模式:
              網(wǎng)絡(luò)層單獨線程來對LinkManager進行管理,收發(fā)消息加入到LinkMessageBuff(單個Link的消息緩存)中---》收到消息加入服務(wù)器消息隊列中(這里一般可以通過一個消息回調(diào)函數(shù)將消息BUFF引出加入到服務(wù)器的消息隊列中),而后是服務(wù)器的消息處理線程對消息隊列進行處理,拿出消息做邏輯處理。
              如此架構(gòu),在通用模式下較好,較好的實現(xiàn)了模塊化方式,單獨庫的形式,并且與服務(wù)器的具體邏輯處理耦合度較低(只有服務(wù)器開啟的一次網(wǎng)絡(luò)包導(dǎo)出消息的回調(diào)函數(shù)的注冊),但是如此出現(xiàn)的情況是,消息加入到了服務(wù)器的主消息隊列,而后只有一個消息邏輯處理線程對其進行操作,進行各個邏輯處理,在某種程度上無法較好的實現(xiàn)多線程。http://www.shnenglu.com/ziyebuboka/
              這種情況下,我也做過討論和嘗試,一般的處理情況是在主消息隊列邏輯處理線程之下再分線程(比如可直接轉(zhuǎn)發(fā)線程,或者根據(jù)邏輯模塊轉(zhuǎn)發(fā)線程處理),但是得到的結(jié)果是,
               一個是安全上無法做到保證,比如說從主消息隊列再直接轉(zhuǎn)發(fā)分配到多個線程進行處理,但是這里就無法保證消息處理的先后順序了,大家都很清楚,在一些玩家的邏輯操作上,先后順序是需要嚴格的保證的。
              一個是開發(fā)成本過高,比如實現(xiàn)單個邏輯模塊單獨線程(比如幫派 國家 隊伍的消息處理單獨),如此的話,在某種邏輯操作上,先后順序可得到保證,但是帶來的后果是開發(fā)成本與學(xué)習(xí)成本過高,在開發(fā)過程中將會陷入鎖的海洋。。。。而對于一般程序員來說,實在要求過高。。。而且也過于接近下層結(jié)構(gòu),無法有效隔離層次,實現(xiàn)較好的模塊化開發(fā)。。
      再來看看異變的架構(gòu):http://www.shnenglu.com/ziyebuboka/
               首先我們先來說下服務(wù)器結(jié)構(gòu),服務(wù)器中的場景(地圖)概念很重要,每一個玩家處在服務(wù)器中,最真實的就是處在服務(wù)器的某一個場景某一點上,每一個場景都必然具備一個PlayerManager來對玩家進行管理。而每一個玩家對應(yīng)的正是一個Link。
               如果我們反向思維一下。略微的將LinkManager上移一個層次,將其作為一個場景中的單位,其實一些問題就好解決了。下面具體的說下
              我們把網(wǎng)絡(luò)層對LinkManager進行管理收發(fā)消息的線程做多線程處理,但是此處有一個難點,就是你無法知道與控制與為什么是這個線程管理這個Link 而另一個線程管理另幾個Link。
              我們將此線程處理也上移一個層次,與場景結(jié)合,一個場景一個線程,來管理處于此場景中的玩家Link,每個Link在自己所處于的場景線程中將對消息進行邏輯處理,如此則將前面的幾個問題都解決了。安全上可保證,比如,因為處于一個場景中的,則同步信息可保證安全,而對于上層邏輯也無需關(guān)注很多的線程概念。而對于不同場景間的交互信息(比如遠距離組隊,聊天消息),則可通過場景的轉(zhuǎn)發(fā)消息加入目標場景消息隊列的機制來處理,因而消息處理的安全任然可以保證。
             得到的結(jié)果就是以場景為單位來做多線程對網(wǎng)絡(luò)層進行管理,如此雖然在庫的耦合度上有所增加,但是很多問題都可解決了。此為專門增對游戲服的網(wǎng)絡(luò)包的特殊架構(gòu),而摒棄了過于通用性所帶來的弊端    
    下面具體的說下網(wǎng)絡(luò)層上是如何實現(xiàn):
                 每一個Link都具備了一個socket,玩家加入到一個場景,則將此Link加入到此場景的LinkMange,并將本socket加入到本場景的fd_set中,而后本場景內(nèi)只需要對存在于本場景fd_set中的socket做select處理,對本場景內(nèi)的Link做收發(fā)消息處理即可。(本場景LinkManager初始化時已加入服務(wù)器socket)http://www.shnenglu.com/ziyebuboka/
   

//補充1:
缺點的確有,從架構(gòu)上來說,層次互饒的確不好,但是具備了一定的好處,而且可以從設(shè)計模式的角度做好層次互分,我是這么認為的
1:首先 如果還是在網(wǎng)絡(luò)層一個線程對所有SOCKET做處理 再轉(zhuǎn)發(fā)至各個場景消息隊列 由各個場景的消息處理線程對其做處理,也的確可實現(xiàn)消息處理的多線程,但是不可避免的,在SOCKET對LINK的管理上任然會出現(xiàn)性能瓶頸,因為在進出口上只有一條路(如果進出口這里直接用多線程,則會出現(xiàn)無法知道與控制與為什么是這個線程管理這個Link 而另一個線程管理另幾個Link)
2:如果將LINK的管理層次上到場景級別,缺點是一定層度上與架構(gòu)第二層次互饒,但是優(yōu)點是對各個LINK的管理也不再是一條路了,由各個場景LINK管理線程對各個場景內(nèi)的LINK做管理,也是多條路了,而后再發(fā)至各個場景消息隊列,又各個場景消息處理線程對消息做邏輯層次處理,可解決瓶頸
3:從模式角度來解決耦合度的問題,制造SceneLinkManager 掛接各個場景,制造各個SceneLinkManager線程,服務(wù)器啟動根據(jù)場景來生成,而SceneLogic與PlayerLogic仍在上一層次,消息進入隊列從Link找到Player,并且再制造每個場景的消息邏輯處理線程,消息隊列的邏輯處理只在這里面進行,因而我們?nèi)匀徽J為此Manager還是屬于網(wǎng)絡(luò)層次,對于上層邏輯無需關(guān)注SceneLinkManager的操作。  

//補充2:
@expter
你說的這個就是文里面一開始提到的主流線程的架構(gòu)模式了。網(wǎng)絡(luò)層一個,邏輯層一個。安全性等等肯定都是可以做到非常好的,但是效率上肯定就差了,其實各個場景本來就是獨立,完全可以單獨開線程,這個文討論的就是如何用安全高效的方式來解決多線程
10:27 不知道 在回復(fù)中所提到的也是一種主流方式,在消息的邏輯處理模塊為各個場景單獨開線程,但是網(wǎng)絡(luò)層收發(fā)消息的處理上仍然還是一個,所以我這里提出的就是可以依據(jù)游戲服務(wù)器的特殊性,以場景為單位來管理本場景內(nèi)的LINK,在網(wǎng)絡(luò)收發(fā)處為每個場景開線程來收發(fā)。
也有一種情況可以是直接在網(wǎng)絡(luò)層為link分組各個線程管理,比如預(yù)生成的1000個Link,0--499號Link是A線程管理,500--999是B線程管理,但是這樣會在消息同步等方面出現(xiàn)問題,比如A玩家和B玩家打架 A砍了B一刀,B砍了A一刀,這時候在先后順序上就有可能出現(xiàn)問題了,A的Link在A線程,B的Link在B線程,有可能是A的操作是先做,但是B線程先Tick了,導(dǎo)致B的砍一刀比A的砍一刀先處理了。。所以我這里提出是以場景為單位來管理Link 則這種問題就會避免了。。
我這里提出的模式就是網(wǎng)絡(luò)層以場景為單位線程管理本場景內(nèi)LINK,而后是各個場景再來各個的邏輯處理線程處理各個場景的消息隊列        


         結(jié)束語,本文寫的不好,有不清楚的地方提出我再加。歡迎評論與討論,也希望能得到更好的方式。 http://www.shnenglu.com/ziyebuboka/

posted on 2010-04-25 00:35 ziyebuboka 閱讀(2762) 評論(10)  編輯 收藏 引用 所屬分類: 游戲服務(wù)器

評論

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 10:27 不知道

沒有必要把底層socket操作提到這么高層次來,缺點很明顯。
其實只要有個模塊控制玩家在哪個場景就行了,底層socket收到的消息交給他,有他來分發(fā)給正確的場景線程處理。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 11:57 ziyebuboka

@不知道
缺點的確有,從架構(gòu)上來說,層次互饒的確不好,但是具備了一定的好處,而且可以從設(shè)計模式的角度做好層次互分,我是這么認為的
1:首先 如果還是在網(wǎng)絡(luò)層一個線程對所有SOCKET做處理 再轉(zhuǎn)發(fā)至各個場景消息隊列 由各個場景的消息處理線程對其做處理,也的確可實現(xiàn)消息處理的多線程,但是不可避免的,在SOCKET對LINK的管理上任然會出現(xiàn)性能瓶頸,因為在進出口上只有一條路(如果進出口這里直接用多線程,則會出現(xiàn)無法知道與控制與為什么是這個線程管理這個Link 而另一個線程管理另幾個Link)
2:如果將LINK的管理層次上到場景級別,缺點是一定層度上與架構(gòu)第二層次互饒,但是優(yōu)點是對各個LINK的管理也不再是一條路了,由各個場景LINK管理線程對各個場景內(nèi)的LINK做管理,也是多條路了,而后再發(fā)至各個場景消息隊列,又各個場景消息處理線程對消息做邏輯層次處理,可解決瓶頸
3:從模式角度來解決耦合度的問題,制造SceneLinkManager 掛接各個場景,制造各個SceneLinkManager線程,服務(wù)器啟動根據(jù)場景來生成,而SceneLogic與PlayerLogic仍在上一層次,消息進入隊列從Link找到Player,并且再制造每個場景的消息邏輯處理線程,消息隊列的邏輯處理只在這里面進行,因而我們?nèi)匀徽J為此Manager還是屬于網(wǎng)絡(luò)層次,對于上層邏輯無需關(guān)注SceneLinkManager的操作。   回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 17:57 keror

@ziyebuboka
網(wǎng)絡(luò)層要換成iocp,怎么辦?
你說的優(yōu)點都不是優(yōu)點。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 21:54 ziyebuboka

@keror
通用完全獨立模塊和效率必然要選擇其一了。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 21:55 ziyebuboka

我覺得開發(fā)中還是需要在必要的地方結(jié)合特項目的特殊情況做特殊考慮與處理,
這也就是一種構(gòu)思了,還需要一些具體實施
從設(shè)計模式角度來說,肯定是不夠好的了,要不怎么叫異變呢。。。
不過從性能上來說,個人認為還是提高的。。。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 23:16 expter

我覺得可以分為網(wǎng)絡(luò)層和邏輯層
網(wǎng)絡(luò)底層接收發(fā)消息,
邏輯層處理消息。

邏輯只有1個主線程,不停的響應(yīng)所有消息和定時器觸發(fā).  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-25 23:37 ziyebuboka

@expter
你說的這個就是文里面一開始提到的主流線程的架構(gòu)模式了。網(wǎng)絡(luò)層一個,邏輯層一個。安全性等等肯定都是可以做到非常好的,但是效率上肯定就差了,其實各個場景本來就是獨立,完全可以單獨開線程,這個文討論的就是如何用安全高效的方式來解決多線程
10:27 不知道 在回復(fù)中所提到的也是一種主流方式,在消息的邏輯處理模塊為各個場景單獨開線程,但是網(wǎng)絡(luò)層收發(fā)消息的處理上仍然還是一個,所以我這里提出的就是可以依據(jù)游戲服務(wù)器的特殊性,以場景為單位來管理本場景內(nèi)的LINK,在網(wǎng)絡(luò)收發(fā)處為每個場景開線程來收發(fā)。
也有一種情況可以是直接在網(wǎng)絡(luò)層為link分組各個線程管理,比如預(yù)生成的1000個Link,0--499號Link是A線程管理,500--999是B線程管理,但是這樣會在消息同步等方面出現(xiàn)問題,比如A玩家和B玩家打架 A砍了B一刀,B砍了A一刀,這時候在先后順序上就有可能出現(xiàn)問題了,A的Link在A線程,B的Link在B線程,有可能是A的操作是先做,但是B線程先Tick了,導(dǎo)致B的砍一刀比A的砍一刀先處理了。。所以我這里提出是以場景為單位來管理Link 則這種問題就會避免了。。
我這里提出的模式就是網(wǎng)絡(luò)層以場景為單位線程管理本場景內(nèi)LINK,而后是各個場景再來各個的邏輯處理線程處理各個場景的消息隊列  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程[未登錄] 2010-04-26 08:51 true

邏輯層,按功能劃分模塊,每個模塊由一個待處理隊列,模塊進一步分為有序模塊和無序模塊,有序模塊由一個線程單獨處理,無序模塊多線程處理。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2010-04-26 09:38 ziyebuboka

@true
你說的這種模式也是使用較廣的,而且比較適合使用在賬號代理角色代理上,比如玩家的定時保存信息,完全是無序不需要保證先后順序的,則可以在邏輯層直接轉(zhuǎn)空閑線程處理,而玩家退出登錄這類要保證先后順序的操作就必須要由一個線程單獨處理。在邏輯模塊的開發(fā)上我個人還沒成功使用過,有序和無序的分開解決,是解決了安全問題,但是無形中進一步加大了開發(fā)上手度和難度,而且各邏輯模塊間也再也不能直接交互了,只能以消息棒的形式交互了。  回復(fù)  更多評論   

# re: 游戲服務(wù)器的網(wǎng)絡(luò)層架構(gòu)異變實現(xiàn)服務(wù)器多線程 2013-09-02 00:48 sete

……開篇第一句話就說錯了的,怎么辦?!?!?!  回復(fù)  更多評論   

導(dǎo)航

<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

統(tǒng)計

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩国产bt| 欧美在线视频一区| 久久久精品国产免大香伊| 亚洲午夜羞羞片| 欧美电影免费观看高清| 美女性感视频久久久| 国产欧美精品日韩| 一区二区免费在线播放| 日韩天堂av| 欧美成人a视频| 欧美不卡在线视频| 在线成人亚洲| 久久激情久久| 久久一区中文字幕| 黑人一区二区三区四区五区| 亚洲一区二区三区午夜| 亚洲男女毛片无遮挡| 欧美日韩综合在线免费观看| 亚洲国内精品在线| 亚洲欧洲精品天堂一级| 蜜臀a∨国产成人精品| 欧美99在线视频观看| 精品1区2区| 毛片一区二区三区| 亚洲第一页在线| 亚洲精品免费网站| 欧美成人自拍视频| 亚洲精品日韩在线观看| 一区二区三区高清在线| 欧美日韩午夜精品| 亚洲先锋成人| 久久精品国产精品亚洲综合 | 久久精品女人天堂| 久久综合给合久久狠狠狠97色69| 国自产拍偷拍福利精品免费一| 欧美一激情一区二区三区| 久久久另类综合| 亚洲激情视频在线| 欧美日韩久久| 亚洲伊人色欲综合网| 久久久www成人免费无遮挡大片| 黄色成人精品网站| 欧美激情按摩在线| 一区二区三区三区在线| 欧美在线网站| 亚洲级视频在线观看免费1级| 欧美精品激情| 亚洲综合成人婷婷小说| 久久午夜国产精品| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产欧美日韩精品在线| 久久久人成影片一区二区三区观看| 欧美电影免费网站| 亚洲欧美日韩成人高清在线一区| 国产欧美日韩精品a在线观看| 久久精品一区蜜桃臀影院 | 欧美视频亚洲视频| 午夜欧美大片免费观看| 亚洲第一成人在线| 午夜久久久久| 亚洲精品极品| 国产偷国产偷精品高清尤物| 欧美jizzhd精品欧美喷水 | 一区二区三区视频观看| 久久综合久色欧美综合狠狠| 99精品免费| 激情成人综合网| 欧美午夜精品电影| 麻豆av福利av久久av| 亚洲一区日韩在线| 亚洲国产成人午夜在线一区 | 亚洲精品一区二区三区福利| 久久狠狠婷婷| 亚洲影院色无极综合| 在线国产精品一区| 国产人久久人人人人爽| 欧美日韩久久不卡| 嫩草国产精品入口| 欧美一区二区三区精品 | 亚洲国产合集| 免播放器亚洲| 久久精品国内一区二区三区| 亚洲一区二区三区免费观看 | 宅男噜噜噜66国产日韩在线观看| 黄色精品在线看| 国产精自产拍久久久久久蜜| 欧美日韩另类一区| 欧美黄色成人网| 美国十次了思思久久精品导航| 性欧美videos另类喷潮| 一区二区三区日韩在线观看| 亚洲欧洲日本国产| 亚洲电影免费| 欧美激情久久久久久| 久久这里有精品视频| 久久av一区二区三区| 亚洲欧美日韩在线不卡| 亚洲视频免费在线观看| 亚洲精品在线视频| 亚洲精品国产视频| 亚洲日本va午夜在线电影| 亚洲国产精品成人综合色在线婷婷 | 一区二区成人精品 | 亚洲激情视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 一区二区三区四区五区在线| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲最快最全在线视频| 亚洲精品乱码久久久久久日本蜜臀 | 国产精品伊人日日| 国产欧美 在线欧美| 国产欧美不卡| 国内自拍一区| 亚洲福利在线观看| 亚洲欧洲精品一区二区三区不卡 | 欧美黑人在线观看| 欧美区一区二| 国产精品久久久久久久久果冻传媒| 欧美午夜一区二区福利视频| 欧美性生交xxxxx久久久| 国产精品入口尤物| 国际精品欧美精品| 亚洲黄一区二区三区| 一本色道久久综合一区| 亚洲欧美成人综合| 久久久久一区| 亚洲国产女人aaa毛片在线| 亚洲精选在线| 性欧美暴力猛交另类hd| 久久综合网hezyo| 欧美激情一区二区三区在线| 国产精品www网站| 韩国av一区二区三区| 亚洲三级免费电影| 午夜精品久久久久久久久久久久久| 欧美中文字幕在线视频| 欧美va亚洲va日韩∨a综合色| 亚洲激情视频在线| 亚洲欧美精品在线| 狂野欧美激情性xxxx欧美| 欧美日韩午夜激情| 国产综合色在线| 一区二区三区黄色| 噜噜噜噜噜久久久久久91| 亚洲毛片播放| 久久av资源网站| 欧美精品乱码久久久久久按摩| 国产精品亚洲综合色区韩国| 亚洲国产专区| 欧美伊人久久大香线蕉综合69| 欧美大片专区| 亚洲欧美卡通另类91av| 免费在线观看日韩欧美| 国产女主播视频一区二区| 日韩视频精品| 久久先锋影音av| 亚洲一二三级电影| 欧美激情在线有限公司| 国内综合精品午夜久久资源| 一区二区三区久久网| 美女精品在线观看| 亚洲网友自拍| 欧美精品一区二区三区在线播放| 国产一区成人| 西西裸体人体做爰大胆久久久| 欧美激情视频在线播放| 久久激情视频免费观看| 国产精品一二三| 亚洲香蕉在线观看| 亚洲激情在线| 免费在线观看一区二区| 极品尤物一区二区三区| 久久国产视频网站| 亚洲夜间福利| 欧美午夜不卡影院在线观看完整版免费| 亚洲第一中文字幕在线观看| 久久久久久**毛片大全| 亚洲欧美日韩爽爽影院| 欧美午夜电影在线观看| 亚洲视频999| 日韩视频免费在线| 欧美久久久久久蜜桃| 亚洲精品国产精品国产自| 欧美成人自拍视频| 久热这里只精品99re8久| 在线视频国内自拍亚洲视频| 久久色中文字幕| 久久激情网站| 玉米视频成人免费看| 男人插女人欧美| 裸体女人亚洲精品一区| 亚洲黄色影片| 亚洲人久久久| 欧美日韩视频第一区| 亚洲小说欧美另类婷婷| 亚洲色图综合久久| 国产精品爽爽ⅴa在线观看| 欧美亚洲日本网站| 久久国产精品高清| 亚洲福利专区|