• <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 - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
              其中g(shù)ame工程生成的庫(kù)文件game.lib居然有近四百兆之巨,mangosd和realmd在連接這個(gè)庫(kù)的時(shí)候也要花上好長(zhǎng)一段時(shí)間。當(dāng)然,mangos現(xiàn)在的代碼量也確實(shí)不少了,這也就要考慮到大的工程項(xiàng)目的源代碼管理及模塊工程劃分,至少,像mangos現(xiàn)在這樣,代碼全部放入game目錄中,并且就做為一個(gè)大的工程的方式,其弊端是已經(jīng)顯現(xiàn)了。另外還有功能模塊劃分的問(wèn)題,需要找一個(gè)功能的實(shí)現(xiàn)時(shí),不知道該到哪塊代碼去找,而要擴(kuò)展某部分功能時(shí),也是無(wú)從下手。

              模塊劃分使用最廣泛也是最容易實(shí)現(xiàn)的應(yīng)該算是按接口編程了,實(shí)現(xiàn)的方法不用我多說(shuō),程序員都知道。其好處也是顯而易見(jiàn)的,定義了接口之后,接口的實(shí)現(xiàn)便可以作為一個(gè)獨(dú)立模塊,也就可以單獨(dú)為一個(gè)工程了。

              可以拿mangos處理玩家登錄的過(guò)程來(lái)做個(gè)比方,現(xiàn)在mangos的做法是一個(gè)很長(zhǎng)的順序執(zhí)行的過(guò)程,如果玩家在隊(duì)伍中,則向隊(duì)友發(fā)送上線(xiàn)消息,如果玩家有好友,則向好友發(fā)送上線(xiàn)消息,如果玩家有公會(huì),則向會(huì)員發(fā)送上線(xiàn)消息,等等。這些代碼都是直接調(diào)用各功能部分的代碼來(lái)實(shí)現(xiàn),如果這里考慮一下模塊劃分,并定義出相應(yīng)的接口,那就可以改成調(diào)用好友模塊的上線(xiàn)處理接口,調(diào)用組隊(duì)模塊的上線(xiàn)處理接口,調(diào)用會(huì)會(huì)模塊的上線(xiàn)處理接口,等等。

              有了接口后,這幾個(gè)模塊可以在另外的工程中實(shí)現(xiàn),不用再混在game工程中。對(duì)象通過(guò)定義好的接口來(lái)調(diào)用,這樣只要沒(méi)有改動(dòng)接口,模塊的實(shí)現(xiàn)修改都不會(huì)影響到game工程。

              還可以再進(jìn)一步,在游戲邏輯的處理上再做一些解耦合。還是上面這個(gè)例子,玩家在登錄時(shí),先調(diào)用組隊(duì)模塊接口,再調(diào)用好友模塊接口,再調(diào)用公會(huì)模塊接口......這些順序的執(zhí)行過(guò)程將這些模塊緊緊地耦合在了一起,當(dāng)游戲邏輯變得越來(lái)越復(fù)雜時(shí),類(lèi)似的接口及調(diào)用數(shù)量會(huì)呈爆炸式的增長(zhǎng),這也將會(huì)成為另一個(gè)巨大的問(wèn)題。

              一個(gè)可行的方法是使用被稱(chēng)作事件或者信號(hào)的對(duì)象來(lái)實(shí)現(xiàn)解耦合。仍然拿上面的例子來(lái)說(shuō),當(dāng)玩家登錄成功時(shí),玩家對(duì)象發(fā)出一個(gè)“玩家已登錄”的事件或者信號(hào),對(duì)此事件感興趣的模塊,會(huì)響應(yīng)這個(gè)事件并且做出相應(yīng)的邏輯處理,具體來(lái)說(shuō)就是好友模塊會(huì)向該玩家的好友廣播上線(xiàn)消息,組隊(duì)模塊會(huì)向該玩家的隊(duì)友廣播上線(xiàn)消息,公會(huì)模塊會(huì)向該玩家所在的公會(huì)廣播會(huì)員上線(xiàn)消息,等等。注冊(cè)感興趣的事件及響應(yīng)事件的處理過(guò)程都是在各獨(dú)立模塊內(nèi)部完成,玩家對(duì)象本身并不知道也不需要知道有這么些過(guò)程。這樣,想要?jiǎng)h除或者擴(kuò)展功能就比較的方便了。

              sigslot這個(gè)開(kāi)源庫(kù)就提供了我們所要的這項(xiàng)功能。在玩家對(duì)象內(nèi)部定義一個(gè)Signal對(duì)象,功能模塊從has_slot派生,并且將自己連接到玩家對(duì)象的signal對(duì)象上,這樣當(dāng)玩家對(duì)象的signal對(duì)象被emit時(shí)便會(huì)調(diào)用到該模塊內(nèi)。在收到這個(gè)信號(hào)時(shí)你可能還需要一些參數(shù),至少應(yīng)該知道到底是誰(shuí)登錄了吧,沒(méi)關(guān)系,signal中可以帶任意多個(gè)參數(shù),完全由你來(lái)控制,但遺憾的是他的slot不支持返回值。如果你不能容忍這樣大的一個(gè)功能缺失的話(huà),boost::signal或許可以滿(mǎn)足你的要求,但太過(guò)于復(fù)雜的東西我一向不大喜歡,boost就屬于這一類(lèi),雖然他非常的強(qiáng)大。

              還有一個(gè)可考慮的選擇是FastDelegate,不過(guò)你得自己做一些封裝才能實(shí)現(xiàn)我們上面提到的類(lèi)似功能。雖然FastDelegate基本上只是實(shí)現(xiàn)了一個(gè)安全的回調(diào)函數(shù)的功能,但是自己封裝出來(lái)的東西或許更適合你的需求,也可以試一試。
            久久久中文字幕日本| 久久er热视频在这里精品| 久久伊人五月丁香狠狠色| 亚洲中文字幕无码久久精品1| 99久久精品午夜一区二区 | 成人精品一区二区久久| 亚洲а∨天堂久久精品9966| 精品国产VA久久久久久久冰| 欧美午夜A∨大片久久| 999久久久免费精品国产| 婷婷久久五月天| 国产精久久一区二区三区| 久久精品人成免费| 久久久久波多野结衣高潮| 国内精品久久久久久久涩爱| 久久精品人人做人人妻人人玩| 欧美午夜精品久久久久久浪潮| 色综合久久综合网观看| 久久福利青草精品资源站| 亚洲精品乱码久久久久久蜜桃图片| 久久亚洲中文字幕精品一区四| 久久91精品国产91久久麻豆| 久久精品国产网红主播| 精品久久久久久无码专区不卡 | 久久精品国产2020| 久久久无码精品亚洲日韩软件| 香蕉久久一区二区不卡无毒影院| 久久国产精品77777| 久久精品水蜜桃av综合天堂| 人妻少妇久久中文字幕| 久久久久99精品成人片欧美| 久久这里只有精品18| 国产人久久人人人人爽| 69SEX久久精品国产麻豆| 久久久精品一区二区三区| 久久线看观看精品香蕉国产| 国产精品久久网| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 99久久国产免费福利| 久久婷婷五月综合97色直播| 亚洲国产天堂久久综合|