• <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)的東西或許更適合你的需求,也可以試一試。
            中文字幕久久久久人妻| av午夜福利一片免费看久久| AAA级久久久精品无码区| 精品久久久久久无码中文野结衣| 开心久久婷婷综合中文字幕| 亚洲中文字幕伊人久久无码| 久久精品黄AA片一区二区三区| 精品人妻伦九区久久AAA片69 | 青草影院天堂男人久久| 人人狠狠综合88综合久久| 久久中文骚妇内射| 久久久久久九九99精品| 欧美一级久久久久久久大| 久久综合视频网站| 国内精品久久久久久久97牛牛| 四虎影视久久久免费| 97久久国产亚洲精品超碰热| 久久天天躁狠狠躁夜夜av浪潮| 国产精品久久久久…| 色综合久久无码中文字幕| 伊人久久无码精品中文字幕| 91精品国产91热久久久久福利| 伊人久久久AV老熟妇色| 久久人妻少妇嫩草AV蜜桃| 久久国产精品免费一区| 日韩精品久久久久久| 久久美女网站免费| 99麻豆久久久国产精品免费| 亚洲午夜久久久影院| 97久久婷婷五月综合色d啪蜜芽 | 国产精品免费久久久久久久久| 国产精品久久久久jk制服| 男女久久久国产一区二区三区 | 久久99精品国产麻豆宅宅| 亚洲人成网站999久久久综合| 国内精品久久久久久久久电影网| 国产精品久久久久9999高清| 99久久精品费精品国产一区二区| 久久精品一区二区国产| 99精品久久精品| 久久精品国产99国产电影网 |