Posted on 2011-01-19 19:18
點(diǎn)點(diǎn)滴滴 閱讀(1110)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
10 服務(wù)器
其中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)的東西或許更適合你的需求,也可以試一試。