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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

MMO游戲?qū)ο髮傩栽O(shè)計(jì)

MMO游戲?qū)ο髮傩栽O(shè)計(jì)

Author: Kevin Lynx
Date: 5.2.2011

一般的MMORPG中,游戲?qū)ο笾饕ü治锖屯婕摇_@兩類對象在經(jīng)過游戲性方面的不斷“進(jìn)化”后,其屬性數(shù)量及與之相關(guān)的邏輯往往會變得很巨大。如何將這一塊做得既不損失效率,又能保證結(jié)構(gòu)的靈活、清晰、可維護(hù)?本文將提供一種簡單的結(jié)構(gòu)。

原始結(jié)構(gòu)

最原始的結(jié)構(gòu),極有可能為這樣:

Player:     +---------------+
            | property-1    |
            +---------------+
            | property-2    |
            +---------------+
            |     ...       |
            +---------------+
            | operator-1    |
            +---------------+
            | operator-2    |
            +---------------+
            | ...           |
            +---------------+

也就是,一個對象為一個C++類,然后里面直接塞滿了各種屬性名,然后是針對這個屬性的邏輯操作(函數(shù))。其結(jié)果就是Player成為巨類。針對這個情況,一直以來我覺得可以使用一種簡單的方法來拆分這個類。冠以官腔,稱之為Entity-Component-based Desgin。產(chǎn)生這種想法和我的個人技術(shù)積累有一定關(guān)系,見下文。

Policy-based Design

Policy-based Design,基于決策的設(shè)計(jì)。這個概念來源于<Modern C++ Design>。雖然這本書講述的是針對C++模板的使用及設(shè)計(jì)技巧。但這種思想依然被我潛意識般地用在其他地方。Policy大致來說就是一個小的組件(Component)。它努力不依賴于其他東西,它可能就是個簡單的類,它擁有極少的數(shù)據(jù)結(jié)構(gòu),及針對這些數(shù)據(jù)的極少操作接口。舉例而言,玩家MP的自動回復(fù)功能,就可封裝為一個Policy。將許多Policy組合起來,就可完成一個復(fù)雜的功能。

這種思想還可指導(dǎo)很多程序結(jié)構(gòu)方面的設(shè)計(jì)。例如在做功能的接口拆分時(shí),就將每個函數(shù)設(shè)計(jì)得足夠小,小到單純地完成一個功能。一個功能的入口函數(shù),就將之前實(shí)現(xiàn)的小函數(shù)全部組合起來,然后共同完成功能點(diǎn)。

當(dāng)然,<Modern C++ Design>里的Policy在表現(xiàn)形式上有所不同。但其核心思想相同,主要體現(xiàn)在 組合 特點(diǎn)上。

Entity-Component-based Design

Entity-Component-based Design按照google到的文章,嚴(yán)格來說算是與OOP完全不同的軟件設(shè)計(jì)方法。不過在這里它將按照我的意思重新被解釋。

如果說Policy-based Design極大可能地影響著我們平時(shí)的細(xì)節(jié)編碼,那么Entity-Component則是直接對游戲?qū)ο蟮慕Y(jié)構(gòu)設(shè)計(jì)做直接的說明。 一個游戲?qū)ο缶褪且粋€Entity。 Entity擁有很少的屬性,也許僅包含一個全局標(biāo)示的ID。 一個Component則是Entity的某個行為、或者說某個組成部分。 其實(shí)說白了,以玩家為例,一個玩家對象就是一個Entity,而一個MP的自動回復(fù)功能就可被包裝為一個Component。這個Component可能包含若干與該功能相關(guān)的數(shù)據(jù),例如回復(fù)時(shí)間間隔,每次的回復(fù)量等。我們往玩家對象這個Entity添加各種Component,也就是給玩家添加各種邏輯功能。

但是,Component之間可能會涉及到交互,玩家對象之外的模塊可能也會與玩家內(nèi)的某個Component交互。子功能點(diǎn)的拆分,不得不涉及到更多的膠水代碼,這也算一種代價(jià)。

游戲?qū)ο髮傩栽O(shè)計(jì)

這份屬性結(jié)構(gòu)設(shè)計(jì),基本就是參考了上面提到的設(shè)計(jì)思想。整個系統(tǒng)有如下組件:

Entity:    +-------------------+
           | property-table    |
           +-------------------+
           | component-table   |
           +-------------------+
Property:  +-------------------+
           | observer-list     |
           +-------------------+
Component: +--------------------+
           | logic-related data |
           +--------------------+
           | logic-related func |
           +--------------------+

意即,所有Entity都包含一個屬性表和組件表。這里的屬性表并非硬編碼的屬性數(shù)據(jù)成員集合,而是一個key-value形式的表。Property包含一個觀察者列表,其實(shí)就是一系列回調(diào)函數(shù),但是這些觀察者本質(zhì)上也是組件,后面會提到。Component正如上文描述,僅包含Component本身實(shí)現(xiàn)的功能所需要的數(shù)據(jù)和函數(shù)。整個結(jié)構(gòu)大致的代碼如下:

class Entity {
private:
    GUID id;
    std::map<std::string, IComponent*> components;
    std::map<std::string, Property*> properties;
};
class Property {
private:
    std::string name;
    Value val;
    std::vector<IComponent*> observers;
};
class IComponent {
public:
    virtual bool Operate (const Args &args) { return false; }
    virtual void OnNotify (const Property &property, const Args &args) {}
protected:
    std::string name;
    Entity *entity;
};

屬性本身是抽象的,這完全是因?yàn)槲覀儗傩越y(tǒng)一地放在了一個表里。從而又導(dǎo)致屬性的值也需要繼續(xù)閱讀

posted on 2011-05-02 19:19 Kevin Lynx 閱讀(7057) 評論(18)  編輯 收藏 引用 所屬分類: game develop模塊架構(gòu)

評論

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-02 20:19 so

MUD游戲編程里也有屬性集這樣的設(shè)計(jì)。靈活。不過訪問速度上肯定沒有直接定死屬性來得快。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-02 20:36 Kevin Lynx

@so
加了個“繼續(xù)閱讀”指向我那個獨(dú)立博客。- -| 你都要在這里留言。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 10:33 lin_style

有個問題:是否代碼行數(shù)多、屬性多,就代表他的邏輯一定是復(fù)雜的?一定要拆分?  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 12:02 飯中淹

你那個獨(dú)立博客在CHROME上會標(biāo)紅標(biāo)骷髏頭。

  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 12:03 Kevin Lynx

@lin_style
基本上是。雖然邏輯不一定復(fù)雜,可能僅僅是大量功能的堆積。但其維護(hù)性肯定不好。回憶一下當(dāng)你剛接手熟悉一個項(xiàng)目代碼時(shí),看到一個巨類時(shí)的感覺。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 12:11 Kevin Lynx

@飯中淹
Linux下的chrome看沒有什么骷髏頭啊。。- -|  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 12:51 lin_style

@Kevin Lynx
如果能夠一遍就看懂“巨類”,我可能覺得這種分類方式是對的。比如人物屬性,人物本來就有這么多屬性啊。而且這些屬性放在一起,并沒有很復(fù)雜的讀取邏輯,即使有不同的功能拓展,那也是每個功能類自己的模塊化問題。你文中,"ClientUpdater" “HP”,從概念上都分成獨(dú)立的屬性模塊."ClientUpdater"有必要這么做,但是也可以看成一個功能模塊類去維護(hù)它,況且它也是屬于游戲玩法類的,放在屬性接口層也不一定合適。而"HP",是一個很清晰的概念,不需要專門的封裝它,即使有hP1~HP1000這么多屬性,也沒有帶來多高的復(fù)雜讀。如果僅是憑借自己的編程習(xí)慣去封裝,那這個過與不過的度怎么區(qū)分呢?  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 13:57 Kevin Lynx

@lin_style
復(fù)雜性和可維護(hù)性不僅體現(xiàn)在本項(xiàng)目,一般一個團(tuán)隊(duì)的下個項(xiàng)目就是在上個項(xiàng)目的基礎(chǔ)上改。所以希望把這些游戲相關(guān)的東西盡量獨(dú)立出來。理想情況下是到了下個項(xiàng)目可以直接通過移除一部分模塊添加一部分模塊即可。

當(dāng)然,如你所說,確實(shí)存在度的把握問題。我現(xiàn)在是打算把基礎(chǔ)屬性(例如坐標(biāo))寫死,或者通過本文的機(jī)制在程序里添加;其他屬性(主要是戰(zhàn)斗屬性、什么中毒抗性啊、暴擊傷害比率啊)放在腳本或配置里擴(kuò)展。

但是如果是做引擎,這些包裝則是必須的了。
ps. 因?yàn)樵趫F(tuán)隊(duì)里某部分代碼可能會在時(shí)間線上由不同的人修改,盡早地提出一種明顯的規(guī)則,可以約束后面的人不至于隨意而為。如果一開始就在Player類里塞功能,早期可能沒問題,不過隨著項(xiàng)目進(jìn)展,后面的人極有可能模仿前人的做法,最終就會導(dǎo)致不斷地在Player里加功能代碼。膨脹由此而來。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 15:58 飯中淹

接著我在那邊跟你說的,我是不允許代碼和腳本碰數(shù)據(jù)對象的屬性的。

屬性必須由對象設(shè)計(jì)器生成。這個對象設(shè)計(jì)器是在線的,也就是運(yùn)行時(shí)創(chuàng)建,更改的。

映射也是,映射說起來就是一種腳本,用來關(guān)聯(lián)對象之間的屬性的東西。


  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 16:06 Kevin Lynx

@飯中淹
話說你把你們的服務(wù)器整成全部配置驅(qū)動的;而我們在向全部腳本驅(qū)動靠近。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 17:58 飯中淹

@Kevin Lynx
配置+腳本共同的
每個都可以實(shí)時(shí)修改
這樣該錯誤,更新什么的,根本不用重啟了

服務(wù)器本身的程序就是一堆底層的庫在那里

然后就是支持這些數(shù)據(jù)對象和映射。

數(shù)據(jù)對象雖然看起來很復(fù)雜,實(shí)際上是個簡單功能的容器類,和封包的結(jié)構(gòu)很像。

大部分的事情都是在映射里做的。而這些映射都是腳本的。


腳本我準(zhǔn)備用quartz composer那種卡片式的,這樣可以用IPAD,GPAD,樂PAD等各種PAD,用3G卡在某個公園的角落里摸幾下就把服務(wù)器BUG給修改好了。





  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 18:01 飯中淹

@Kevin Lynx
數(shù)據(jù)也腳本化,我感覺不合適。

我是要提供可視化編輯工具給策劃,讓他們自己去設(shè)計(jì)數(shù)據(jù)對象。

腳本這些粗活,就是服務(wù)器程序來做。

所有工具都做成各種PAD可部署的,這樣就不用限制辦公地點(diǎn)和時(shí)間了。

隨時(shí)隨地做事。

有個好的點(diǎn)子可以立即應(yīng)用到實(shí)際的游戲服務(wù)中去。

  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 18:05 Kevin Lynx

@飯中淹
我們這回策劃將編寫大量腳本。瞬間在策劃組掀起了學(xué)習(xí)Lua的熱潮。整體架子的發(fā)展路線,和你說的差不多。程序這邊僅提供底層功能實(shí)現(xiàn)。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì)[未登錄] 2011-05-03 18:15 楊粼波

數(shù)據(jù)還是放到配置里面的好,比如csv,xml。
放腳本里面可以,但是編輯性不好啊。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 19:37 Kevin Lynx

@楊粼波
這倒提醒我了。還真是不方便編輯。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-03 23:20 cui

都是單線程的服務(wù)? 多線程的服務(wù)實(shí)時(shí)更新配置文件,需要加的互斥太多了  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2011-05-06 10:55

@Kevin Lynx
@飯中淹

配置驅(qū)動與腳本驅(qū)動,我更偏向配置驅(qū)動,腳本太靈活了,debug的難度很大,要求高,不宜開放出去。配置驅(qū)動配置死了點(diǎn),但是安全穩(wěn)定。寫一個配置編輯器來控制錯誤相對比較簡單。

贊同@飯中淹 “不允許代碼和腳本碰數(shù)據(jù)對象的屬性的”,不然實(shí)在是非常危險(xiǎn)。對于腳本,應(yīng)該再封裝一層api。  回復(fù)  更多評論   

# re: MMO游戲?qū)ο髮傩栽O(shè)計(jì) 2012-02-08 17:41 阿飛

拜讀中,繼續(xù)學(xué)習(xí)!  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲专区一区| 亚洲日本一区二区| 国产伦精品一区| 日韩视频永久免费| 欧美精品亚洲| 性色av香蕉一区二区| 欧美日韩在线免费观看| 欧美一区二区免费观在线| 亚洲国产欧美日韩另类综合| 久久全球大尺度高清视频| 亚洲欧美久久久| 欧美影院视频| 亚洲乱码视频| 欧美一区视频| 欧美天天视频| 国产精品成人一区| 欧美激情一区| 久色成人在线| av成人免费在线| 亚洲日本成人| 一本色道久久综合精品竹菊 | 99精品视频免费观看视频| 欧美 日韩 国产精品免费观看| 欧美成人黑人xx视频免费观看| 亚洲日本视频| 91久久极品少妇xxxxⅹ软件| 亚洲欧洲日产国产综合网| 亚洲国产高潮在线观看| 国产一区成人| 日韩视频免费观看| 久久精品水蜜桃av综合天堂| 欧美日韩精品一区二区天天拍小说| 久久伊人亚洲| 久久av一区二区三区漫画| 久久免费视频在线观看| 亚洲第一在线视频| 国产一区二区高清不卡| 亚洲欧洲在线看| 亚洲精品美女在线观看| 中日韩男男gay无套| 免费不卡在线观看| 欧美大片91| 亚洲欧美国产高清va在线播| 午夜精品久久久久久久久久久久| 国产精品久久久久久久久久免费看 | 亚洲福利国产精品| 久久久青草婷婷精品综合日韩| 欧美手机在线视频| 欧美日韩亚洲一区二区三区在线观看 | 久久久久综合网| 亚洲图片欧美一区| 亚洲一区三区电影在线观看| 欧美日韩在线播放三区| 国产精品久久久久9999| 狠狠色综合日日| 午夜电影亚洲| 欧美日韩ab片| 一本久久a久久免费精品不卡| 暖暖成人免费视频| 欧美三级欧美一级| 欧美精品系列| 久久午夜精品| 国产欧美日韩视频一区二区三区| 亚洲人成网站精品片在线观看| 国产精品99久久久久久有的能看| 久久九九久精品国产免费直播| 在线中文字幕一区| 在线电影一区| 亚洲一区免费网站| 在线视频观看日韩| 在线成人性视频| 亚洲日本中文字幕区| 欧美日韩亚洲系列| 午夜亚洲伦理| 欧美激情导航| 性欧美大战久久久久久久免费观看| 欧美一级大片在线观看| 亚洲天堂免费观看| 免费久久99精品国产自| 男女激情视频一区| 亚洲激情视频| 久久成人精品电影| 日韩亚洲欧美一区二区三区| 亚洲女人小视频在线观看| 好吊视频一区二区三区四区| 在线一区二区日韩| 亚洲色图在线视频| 看欧美日韩国产| 一区免费观看| 欧美日本国产一区| 欧美激情无毛| 91久久夜色精品国产网站| 欧美在线黄色| 欧美日韩一区在线播放| 尹人成人综合网| 国产精品美女一区二区| 国产午夜精品久久久| 亚洲精品日本| 午夜精品久久久久久久99水蜜桃 | 一区二区三区四区国产| 亚洲欧美日韩另类| 亚洲乱码视频| 欧美午夜剧场| 免费国产一区二区| 亚洲福利精品| 国产精品爽黄69| 久久精品成人欧美大片古装| 亚洲午夜精品网| 性亚洲最疯狂xxxx高清| 极品尤物久久久av免费看| 精品成人久久| 免费不卡视频| 先锋a资源在线看亚洲| 最近看过的日韩成人| 牛牛影视久久网| 久久在线观看视频| 蜜臀久久99精品久久久久久9 | 亚洲午夜激情网站| 黄色另类av| 欧美刺激午夜性久久久久久久| 一本色道久久88综合亚洲精品ⅰ| 欧美乱人伦中文字幕在线| 欧美国产激情二区三区| 欧美gay视频激情| 欧美黑人一区二区三区| 狠狠综合久久| 在线观看亚洲精品视频| 欧美成人免费网| 免费观看30秒视频久久| 久久久免费精品| 亚洲男同1069视频| 亚洲一本大道在线| 一道本一区二区| 这里是久久伊人| 性18欧美另类| 久久久午夜精品| 亚洲国产另类久久久精品极度| 欧美成人嫩草网站| 欧美日韩一区二区三区| 国产一区二区三区免费不卡| 久久久免费精品| 久久亚洲高清| 在线视频欧美日韩| 久久在线免费| 国产精品热久久久久夜色精品三区| 亚洲美女在线国产| 久久久精品午夜少妇| 一区二区三区国产盗摄| 亚洲一级免费视频| 老司机一区二区| 久久久久综合一区二区三区| 免费精品视频| 国产一区二区三区在线播放免费观看 | 亚洲无亚洲人成网站77777| 欧美在线视频免费播放| 免费观看日韩av| 国产欧美日韩综合| 欧美影院精品一区| 正在播放亚洲| 国产精品久久久久免费a∨| 亚洲免费av观看| 亚洲国产精品精华液2区45| 久久伊人亚洲| 日韩一级黄色av| 一区二区三区四区五区精品视频| 亚洲日韩欧美视频一区| 国产免费成人在线视频| 欧美日韩三级在线| 亚洲女同性videos| 亚洲欧洲日韩综合二区| 毛片av中文字幕一区二区| 亚洲色图制服丝袜| 国产精品99久久99久久久二8| 欧美成人精品影院| 99国产精品99久久久久久| 亚洲国产视频一区| 欧美日韩国产一区| 亚洲一区视频在线| 亚洲综合日韩在线| 欧美在线网址| 亚洲无亚洲人成网站77777| 亚洲欧美久久久| 99视频在线观看一区三区| 性色av香蕉一区二区| 欧美电影免费观看高清| 欧美一区激情视频在线观看| 女生裸体视频一区二区三区| 久久精品在线| 国产在线精品一区二区夜色| 亚洲少妇最新在线视频| 日韩午夜电影| 欧美99在线视频观看| 欧美一区二区在线免费观看| 亚洲免费高清| 欧美日韩在线免费观看| 在线亚洲观看| 欧美一区观看| 在线看欧美日韩| 欧美精品系列| 亚洲欧美日韩精品一区二区|