• <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>

            cloud

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              29 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(5)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            #

            HWND hWnd  =  FindWindowEx(GetDesktopWindow() ,  0  ,  " Progman "  ,  " Program Manager " );
            hWnd 
            =  FindWindowEx(hWnd ,  0  ,  " SHELLDLL_DefView "  ,  0 );
            hWnd 
            =  FindWindowEx(hWnd ,  0  ,  " SysListView32 "  ,  " FolderView " );
            //  初始化 D3D 設(shè)備 
            InitD3D(hWnd);

            顯示的時(shí)候,如果想渲染在桌面的一角,則可以這樣寫:
            // 顯示在左上角,128×128寬
            RECT rect;
            rect.left 
            = 0;
            rect.right 
            = 128;
            rect.top 
            = 0;
            rect.bottom 
            = 128;
            // 顯示
            g_pd3dDevice->Present(0 , &rect , 0 , 0);

            posted @ 2008-03-21 10:53 cloud 閱讀(839) | 評(píng)論 (0)編輯 收藏

            在游戲引擎中,Entity通常被翻譯成實(shí)體,也常用諸如GameObjectActorSimulationObjectUnitCharacter等名字。相比于對(duì)圖像聲音引擎的熱情,Entity層多年來(lái)一直備受冷遇,但最近幾年隨著大型游戲的發(fā)展,Entity層設(shè)計(jì)的重要性已經(jīng)達(dá)到和圖像聲音的同等水平,而且已經(jīng)出現(xiàn)了多種通用型Entity架構(gòu)。當(dāng)然,這里伴隨著爭(zhēng)議和分歧。

            直接模式(The C Approach

            這是最早、最簡(jiǎn)單、也是任何人都能直接想到的模式。這種方式下一個(gè)Entity就是一個(gè)簡(jiǎn)單的struct:

            struct Mob
            {
            int level, hp, mp, attack, …;
            };

            這種情況下往往需要對(duì)不同類型的Entity定義不同的struct,比如PlayerMobItemDoodad等。Entity的數(shù)據(jù)庫(kù)可以直接使用現(xiàn)成的數(shù)據(jù)庫(kù)系統(tǒng)或者從數(shù)據(jù)文件讀取,比如csv文件。一般會(huì)選擇Excel編輯數(shù)據(jù)庫(kù),然后導(dǎo)出csvExcel的強(qiáng)大表格和統(tǒng)計(jì)計(jì)算功能是調(diào)節(jié)游戲數(shù)據(jù)平衡的得力工具。以致這種最古老而簡(jiǎn)單的Entity模式以強(qiáng)大的生命力一直活到現(xiàn)在。

            那么為什么Developers會(huì)要去探索其他方式呢?最大的問(wèn)題是這種方式下各種Entity完全不同質(zhì)。比如PlayerMobDoodad都有位置,都要做碰撞檢測(cè),但他們卻是不同的類型,不能使用同一份代碼;PlayerMob都有hpmp,也有基本相同的處理邏輯……當(dāng)然,這個(gè)可以用hack的方法解決:只要各個(gè)struct前若干個(gè)成員類型和順序完全相同,就可以將指針cast成統(tǒng)一的一個(gè)Entity類型來(lái)處理。不過(guò),任何人都能想到更好的辦法,用類!

            繼承模式(Inheritage

            這也是EntityGameObject等這些名字的由來(lái),他們就是基類。于是我們可以得到一顆繼承關(guān)系樹(shù),例如:

            Entity

                   Character

                          Player

                          Mob

                   Missile

                          Laser

                          GuidedMissile

                   Item

                  

            Entity對(duì)象的邏輯大多也是直接包含在類里的。但也有人采用了數(shù)據(jù)對(duì)象和邏輯對(duì)象的分離,其好處是對(duì)相同的數(shù)據(jù)可以替換不同的邏輯。不過(guò),個(gè)人比較懷疑這種分離是否值得,因?yàn)轭惖呐缮旧砭褪强梢該碛胁煌倪壿嫛?/span>

            另外,Entity間的交互除了用標(biāo)準(zhǔn)的直接訪問(wèn)方式外,經(jīng)常使用消息模式。消息模式和Windows的消息模式類似,Entity間通過(guò)消息交互。雖說(shuō)窗口編程畫了多年時(shí)間才擺脫了當(dāng)年肥大的switch的消息處理模式,在Entity層使用消息模式還是有意義的,因?yàn)橄⒑苋菀讖V播且可以直接在網(wǎng)絡(luò)上發(fā)送。執(zhí)著于OO的人會(huì)將消息寫成Command對(duì)象,但原理仍然是一樣的。

            同時(shí),聯(lián)網(wǎng)游戲出現(xiàn),指針不能在不同的機(jī)器上標(biāo)識(shí)對(duì)象,我們必須用穩(wěn)定的ID來(lái)標(biāo)識(shí)對(duì)象,于是我們有了EntityManager來(lái)分配ID和管理對(duì)象集合,或者叫GameObjectManagerObjectManager等。這在一段時(shí)期內(nèi)幾乎成了完美的方案。

            隨著游戲內(nèi)容的豐富性的迅速膨脹,傳統(tǒng)的由程序員來(lái)實(shí)現(xiàn)游戲邏輯功能的模式也越來(lái)越力不從心。腳本語(yǔ)言的集成將大部分創(chuàng)意性工作從程序員的擔(dān)子上拿了下來(lái),交還給游戲設(shè)計(jì)人員。為了給腳本提供足夠的控制權(quán),Entity結(jié)構(gòu)上必須有充分的靈活性。

            數(shù)據(jù)驅(qū)動(dòng)(Data-Driven

            現(xiàn)在有句很流行的話,“唯一不變的是變化。(The only constant is change.)”數(shù)據(jù)驅(qū)動(dòng)使得變化對(duì)引擎的影響最小化。數(shù)據(jù)驅(qū)動(dòng)不能算是一種獨(dú)立的Entity模式,不如說(shuō)它是一種設(shè)計(jì)思想,其目的就是將內(nèi)容制作和游戲引擎的制作分離開(kāi)來(lái)。與上面所說(shuō)的填充Entity屬性數(shù)據(jù)庫(kù)的不同之處在于,它還要能通過(guò)數(shù)據(jù)來(lái)設(shè)計(jì)游戲邏輯。

            游戲設(shè)計(jì)人員需要的一項(xiàng)最基本功能就是自定義人物屬性,所以與其在類里寫死屬性成員,不如使用屬性表(Attributes/Properties)。通常使用一個(gè)哈希表(Hashtable),或者std::map,或者Dictionary,或者就是個(gè)數(shù)組,隨個(gè)人喜好,其實(shí)就是要一個(gè)key-value的映射表。然后為腳本和編輯器提供對(duì)屬性表的操作。

            動(dòng)態(tài)的邏輯主要就靠腳本了,必須為腳本提供足夠的事件和方法。個(gè)人推薦用Lua腳本,因?yàn)樗窃谟螒蝾I(lǐng)域內(nèi)用得最多的通用腳本語(yǔ)言,其引擎很小、速度很快、易于集成,盡管語(yǔ)法過(guò)于松散。不要迷信宣傳去用龐大、極慢、難于集成的Python。為腳本提供事件,其實(shí)也就是調(diào)用腳本里的函數(shù),這里如果使用了前面所述的消息模式,那么就只要調(diào)用一個(gè)腳本方法,傳遞不同的消息參數(shù)就行了。當(dāng)然也有人覺(jué)得這樣很丑陋而更愿意為不同的事件注冊(cè)不同的函數(shù)。

            當(dāng)有了數(shù)據(jù)驅(qū)動(dòng)后,Entity的繼承樹(shù)就基本失去意義了,因?yàn)橐粋€(gè)Entity是什么已經(jīng)不是程序里決定的了,而是通過(guò)數(shù)據(jù)和腳本設(shè)計(jì)出來(lái)的。但數(shù)據(jù)和腳本又不是全部,一個(gè)Entity的核心內(nèi)容和需要高效處理的部分,如碰撞檢測(cè),還是要程序來(lái)完成。于是我們需要重新設(shè)計(jì)Entity類,困難的局面也就由此開(kāi)始。

            一個(gè)直觀的想法是一個(gè)統(tǒng)一且唯一的Entity類,它包含了所有的基本功能,如顯示、碰撞檢測(cè)、運(yùn)動(dòng)、背包等,然后由數(shù)據(jù)決定哪些組件被啟用。比如一個(gè)玩家角色可能會(huì)啟用絕大部分組件,而一顆樹(shù)只啟用顯示和碰撞檢測(cè)組件。但也伴隨著缺點(diǎn):一、這個(gè)類太大了;二、對(duì)于樹(shù)木等一些簡(jiǎn)單的Entity也要浪費(fèi)其他組件的私有數(shù)據(jù)所占的內(nèi)存。那么一個(gè)簡(jiǎn)單的折中是部分使用繼承、部分使用數(shù)據(jù)定制。例如Entity只提供最基本的組件,再派生出CharactorEntity提供足夠人物角色使用的組件。

            組件模式(Component-Based Entity

            提到組件,那么很自然的就過(guò)渡到組件模式,就是把顯示、運(yùn)動(dòng)、攻擊、背包、隊(duì)伍、聲音等基本功能都做成獨(dú)立的組件,由數(shù)據(jù)來(lái)決定向Entity里添加哪些組件。由此可以得到另外一個(gè)擴(kuò)展,就是既然可以有引擎內(nèi)置的組件,那就也可以有腳本制作的組件,實(shí)現(xiàn)腳本模塊的復(fù)用。這種模式在GDC2002正式提出,到現(xiàn)在主流的引擎都有這種設(shè)計(jì)。

            這種模式在理論上很完美,但實(shí)踐上還是有不少疑問(wèn)。最常見(jiàn)的問(wèn)題就是組件間的依賴關(guān)系。理想情況下,各個(gè)組件是完全獨(dú)立的,但實(shí)踐中必然有所依賴。比如運(yùn)動(dòng)速度、攻擊強(qiáng)度等和角色的基本屬性有關(guān),運(yùn)動(dòng)組件需要角色的包圍盒來(lái)測(cè)試是否碰撞,AI組件需要分析角色當(dāng)前狀態(tài)和發(fā)出運(yùn)動(dòng)、攻擊命令,角色動(dòng)作狀態(tài)變化時(shí)改變顯示組件屬性,攻擊組件需要訪問(wèn)隊(duì)伍信息組件以禁止攻擊隊(duì)友等等。處理這種依賴關(guān)系主要要解決兩個(gè)問(wèn)題:

            <!--[if !supportLists]-->一、              <!--[endif]-->誰(shuí)依賴誰(shuí)。比如是敏捷屬性改變而去修改移動(dòng)速度,還是運(yùn)動(dòng)組件讀取敏捷屬性來(lái)計(jì)算移動(dòng)速度。如果要游戲設(shè)計(jì)人員自由定義基本屬性的話,就要選擇前者,因?yàn)榛緦傩越M件會(huì)是腳本組件。

            <!--[if !supportLists]-->二、              <!--[endif]-->如何取得另一組件的指針/引用。常見(jiàn)的方法是給每個(gè)組件類型一個(gè)唯一ID,然后用該IDEntity上查詢注冊(cè)了的組件,如果找到返回其指針/引用,否則返回null。當(dāng)然,每次訪問(wèn)都做這個(gè)查詢會(huì)很浪費(fèi)CPU,如果Entity的組件不會(huì)在運(yùn)行時(shí)動(dòng)態(tài)添加刪除的話(除非在編輯器里,否則很少有人會(huì)這么做),可以在Entity初始化后讓每個(gè)組件緩存它所要用的其他組件指針。那么當(dāng)所依賴的組件不存在怎么辦,一般情況下都是無(wú)聲地忽略。

            當(dāng)Entity由很多組件組成后,交互的消息需要發(fā)給每一個(gè)組件。這里又一次體現(xiàn)出消息機(jī)制的優(yōu)勢(shì),你不需要在Entity里為每一個(gè)事件函數(shù)寫一個(gè)loop來(lái)調(diào)用組件的相應(yīng)事件函數(shù)。但這里也出現(xiàn)了一個(gè)問(wèn)題,消息到達(dá)各個(gè)組件的順序。很多時(shí)候這個(gè)順序不會(huì)有什么影響,但個(gè)別時(shí)候不同的順序會(huì)導(dǎo)致完全不同的邏輯發(fā)展方向。

            此外,Entity的序列化存儲(chǔ)也變得比較復(fù)雜,經(jīng)典的Excel導(dǎo)出csv的模式難以奏效,因?yàn)檫@里需要結(jié)構(gòu)化的存儲(chǔ),所以需要結(jié)構(gòu)化的數(shù)據(jù)文件如XML來(lái)存儲(chǔ),或者完全用腳本來(lái)包含所有數(shù)據(jù)和構(gòu)造Entity

            據(jù)個(gè)人經(jīng)驗(yàn),使用數(shù)據(jù)驅(qū)動(dòng)的繼承模式時(shí)很是向往組件模式,感覺(jué)上它一個(gè)非常自然的擴(kuò)展方向,但顧忌其引入的額外的復(fù)雜性,尤其是需要游戲設(shè)計(jì)人員具有一定的編程能力,所以一直不敢全盤接過(guò)使用。但退一步,在引擎里仍然使用組件思想,但Entity的組件構(gòu)成在編譯時(shí)固定,可以達(dá)到某種妥協(xié),這和采用繼承與數(shù)據(jù)驅(qū)動(dòng)的折中類似。

            混入模式(Mix-in

            這是又一種常見(jiàn)的折中模式,即使用C++的多重繼承,將各個(gè)組件類混入一個(gè)Entity類。如:

            class Mob: public GameObject, public Renderable, public Movable, public Attackable
            {

            }

            這種方法因其簡(jiǎn)單而且非常符合多重繼承設(shè)計(jì)思想而被很多引擎采用。當(dāng)然缺點(diǎn)也是只能在支持多重繼承的語(yǔ)言里使用,而且當(dāng)組件很豐富時(shí),dynamic_cast就變成一個(gè)代價(jià)高昂的操作。

            功能性與復(fù)雜性(Functionality vs Complexity

            編程領(lǐng)域最古老的原則之一就是要“簡(jiǎn)單快速”。但隨著問(wèn)題的復(fù)雜化,程序也隨之變得越來(lái)越復(fù)雜。好的方法應(yīng)該能有效的降低或隱藏復(fù)雜性。但是,沒(méi)有不帶副作用的藥(No silver bullet.),在取得更強(qiáng)大的功能的同時(shí)總會(huì)帶來(lái)額外的復(fù)雜性。我們需要做出權(quán)衡,在必要時(shí)犧牲一些功能,也就是要估算性價(jià)比。

            一般游戲內(nèi)容制作人員不會(huì)或不太會(huì)編程,編程人員也不善于游戲的內(nèi)容創(chuàng)造和數(shù)值平衡,過(guò)于復(fù)雜的系統(tǒng)會(huì)導(dǎo)致需要兩面兼顧的人才,會(huì)大大增加做出一款游戲的難度。

            posted @ 2008-01-09 15:14 cloud 閱讀(567) | 評(píng)論 (0)編輯 收藏

                 摘要: 免費(fèi)引擎 Agar - 一個(gè)高級(jí)圖形應(yīng)用程序框架,用于2D和3D游戲。 Allegro library - 基于 C/C++ 的游戲引擎,支持圖形,聲音,輸入,游戲時(shí)鐘,浮點(diǎn),壓縮文件以及GUI。 Axiom 引擎 - OGRE的衍生引擎。 Baja 引擎 - 專業(yè)品質(zhì)的圖像引擎,用于The Lost Mansion。 Boom - Doom代...  閱讀全文
            posted @ 2007-12-25 13:09 cloud 閱讀(12282) | 評(píng)論 (0)編輯 收藏

            vc++2005中的異常捕獲try...catch... 和以往的版本有很大的不同, 默認(rèn)的vc++2005的工程只能捕獲由throw拋出的異常, 當(dāng)然, 如果是用windows的__try...__except, 可以捕獲到結(jié)構(gòu)化異常的, 如果想讓try...catch...捕獲結(jié)構(gòu)化異常, 那么就需要設(shè)置為/EHA, 而不是/EHS
            posted @ 2007-11-29 20:41 cloud 閱讀(432) | 評(píng)論 (0)編輯 收藏

            這幾天一直在找lua的遠(yuǎn)程調(diào)試, 終于找到一個(gè)LuaPlus和remdebug, 在此做個(gè)標(biāo)記
            posted @ 2007-10-20 12:18 cloud 閱讀(739) | 評(píng)論 (0)編輯 收藏

            http://m.shnenglu.com/nacci/archive/2005/11/08/974.html

            posted @ 2007-07-12 11:29 cloud 閱讀(235) | 評(píng)論 (0)編輯 收藏

            軟件開(kāi)發(fā)是一個(gè)動(dòng)態(tài)的過(guò)程,在多人開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)發(fā)送代碼混亂和代碼失控,如為了擴(kuò)展功能經(jīng)常在他人的代碼中加入調(diào)用自己的模塊,在地層函數(shù)中加入自己的業(yè)務(wù)處理邏輯等,經(jīng)常造成多人同時(shí)維護(hù)一段代碼的情況,容易造成模塊間的耦合性太高,代碼難以理解和修改,稍微做修改卻在不相關(guān)的地方出現(xiàn)問(wèn)題。輕微的一處修改特別是地層頭文件的修改會(huì)引起程序大規(guī)模的編譯和連接等。解決此類問(wèn)題的關(guān)鍵在于需要將程序按功能接口化、組件化 
            1.多人開(kāi)發(fā)的基礎(chǔ)---組件化編程,仿COM篇
            2.多人開(kāi)發(fā)基礎(chǔ):組件化編程的簡(jiǎn)化實(shí)現(xiàn)
            posted @ 2007-07-12 11:15 cloud 閱讀(235) | 評(píng)論 (0)編輯 收藏

            這幾天服務(wù)器突發(fā)一個(gè)bug, 登陸的人員會(huì)發(fā)生串號(hào), 就是A玩家登陸后, 得到B玩家的角色.
              這個(gè)bug觸發(fā)的主要原因是網(wǎng)絡(luò)底層在得到一個(gè)客戶端的連接請(qǐng)求時(shí), 會(huì)分配一個(gè)id,而這個(gè)id是用棧在保存的,當(dāng)有新的連接, id就出棧, 當(dāng)連接斷開(kāi)時(shí),id入棧, 這樣就導(dǎo)致了id被重復(fù)利用的次數(shù)非常高,尤其是某些id. 當(dāng)這些id生成后,會(huì)進(jìn)入登陸隊(duì)列,等待登陸結(jié)果, 如果這個(gè)時(shí)候登陸認(rèn)證模塊的速度很慢, 或者說(shuō)這個(gè)時(shí)候客戶端退出了, 這個(gè)時(shí)候的id就是一個(gè)無(wú)效id了, 可是這個(gè)只有網(wǎng)絡(luò)底層知道, 這就造成引用層編寫的難度.  所以最好的解決方案就是每次的連接id都是不一樣的,類似操作系統(tǒng)的HANDLE
            posted @ 2007-06-18 17:37 cloud 閱讀(293) | 評(píng)論 (0)編輯 收藏

            插件式設(shè)計(jì)近年來(lái)非常流行,其中eclipse起了推波助瀾的作用,提到插件式就會(huì)不由自主的想到eclipse。其實(shí)插件式設(shè)計(jì)并不是什么新事物,早在幾十年前就有了。像X Server就是基于插件式設(shè)計(jì)的,除了核心功能外,它所有的擴(kuò)展功能和設(shè)備驅(qū)動(dòng)都是以插件方式加入進(jìn)來(lái)的。

              基于插件的設(shè)計(jì)好處很多:把擴(kuò)展功能從框架中剝離出來(lái),降低了框架的復(fù)雜度,讓框架更容易實(shí)現(xiàn)。擴(kuò)展功能與框架以一種很松的方式耦合,兩者在保持接口不變的情況下,可以獨(dú)立變化和發(fā)布。公開(kāi)插件接口,讓第三方有機(jī)會(huì)擴(kuò)展應(yīng)用程序的功能,有財(cái)大家一起發(fā)。另外,還可以讓開(kāi)源與閉源共存于一套軟件,你的插件是開(kāi)源還是閉源,完全由你自己決定。

              基于插件設(shè)計(jì)并不神秘,相反它比起一團(tuán)泥的設(shè)計(jì)更簡(jiǎn)單,更容易理解。各種基于插件設(shè)計(jì)的架構(gòu)都有自己的特色,但從總體架構(gòu)上看,其模型都大同小異。這里我們介紹一個(gè)簡(jiǎn)單的模型,并給出幾個(gè)實(shí)例,希望對(duì)新手有所啟發(fā)。

              1. 基本架構(gòu)

            plugin.jpg

              插件式設(shè)計(jì)的應(yīng)用程序,基本上可以用上圖來(lái)表示。當(dāng)然,此圖是一種較高層次的表示,實(shí)際的設(shè)計(jì)會(huì)更復(fù)雜一些。我們?cè)谶@里為了闡述方便,不用故意搞得那么復(fù)雜。

              應(yīng)用程序由應(yīng)用程序框架、插件接口、插件和公共函數(shù)庫(kù)四部分組成。

              應(yīng)用程序框架負(fù)責(zé)應(yīng)用程序的整體運(yùn)作,它清楚程序整個(gè)流程,但并不知道每個(gè)過(guò)程具體要做什么。它在適當(dāng)?shù)臅r(shí)候調(diào)用一些插件,來(lái)完成真正的功能。

              插件接口是一個(gè)協(xié)議,可能用IDL描述,可能是頭文件,也可能一段文字說(shuō)明。插件按照這個(gè)協(xié)議實(shí)現(xiàn)出來(lái),就可以加入到應(yīng)用程序中來(lái)。當(dāng)然,對(duì)于復(fù)雜的系統(tǒng),插件接口可能有多個(gè),各自具有獨(dú)立的功能。

              插件是完成實(shí)際功能的實(shí)體,實(shí)現(xiàn)了要求的插件接口。盡管實(shí)現(xiàn)什么以及怎么實(shí)現(xiàn),完全是插件自己的自由。在實(shí)際情況來(lái),一般還是有些限制,因?yàn)椴寮涌诒旧砜赡芫褪且粋€(gè)限制。如,實(shí)現(xiàn)編譯功能的插件,自然不能實(shí)現(xiàn)成一個(gè)聊天功能的插件。

              公共函數(shù)庫(kù)是一組函數(shù)或者類,應(yīng)用程序框架和插件都可以調(diào)用。它通常是一個(gè)獨(dú)立的動(dòng)態(tài)庫(kù)(DLL)。應(yīng)用程序框架本身是公用的,是代碼復(fù)用的一種方式。但并不是所有可復(fù)用代碼都可以放在框架中,特別是插件會(huì)用到的公共代碼,那會(huì)造成插件對(duì)框架的依賴。把這些公共代碼提取到一個(gè)獨(dú)立的庫(kù)中,是一種好的方法。

              另外,值得補(bǔ)充說(shuō)明一下的是插件接口。插件接口通常有兩種:

              通用插件接口:這一類插件接口是通用的,你無(wú)法從接口函數(shù)看出這個(gè)插件的功能。它的接口函數(shù)通常有這些函數(shù):

              init : 用于初始化插件,通常在插件被加載時(shí)調(diào)用。

              deinit:用于反初始化插件,通常在插件被卸載時(shí)調(diào)用。

              run:讓插件起動(dòng)。

              stop:讓插件停止。

              至于插件要完成什么功能,要插到哪里,在init函數(shù)里決定,它調(diào)用公共函數(shù)庫(kù)里的函數(shù)把自己注冊(cè)到框架中某個(gè)位置。

              專用插件接口:這一類插件接口是專用的,看到它的接口函數(shù)說(shuō)明,你就可以大致了解它的功能了。

              加入插件的方式通常采用配置信息來(lái)實(shí)現(xiàn),配置信息可以是注冊(cè)表,也可以配置文件。也可以動(dòng)態(tài)注冊(cè)進(jìn)來(lái),或者把插件放到指定的位置。

              下面我們來(lái)看幾個(gè)實(shí)例:

              2. 桌面設(shè)計(jì)

              最近一段時(shí)間完成了桌面模塊的設(shè)計(jì)和實(shí)現(xiàn)。按照以往的經(jīng)驗(yàn),桌面模塊通常是變化最多的一個(gè)模塊,SPEC總是在不斷的調(diào)整的效果,不同客戶要求實(shí)現(xiàn)具有個(gè)性化的桌面,直到產(chǎn)品快發(fā)布了,桌面的SPEC還在不停的修改。另外,在智能手機(jī)中,桌面占有特殊的地位,很多東西都可能往桌面里塞,桌面不但是各種功能的大雜燴,還是一些系統(tǒng)消息的中轉(zhuǎn)站。

              這個(gè)任務(wù)比較棘手,所以在設(shè)計(jì)時(shí)就分外小心。首先想到的就是采用插件式設(shè)計(jì),把外圍功能獨(dú)立出來(lái),盡量簡(jiǎn)化框架的實(shí)現(xiàn)。

              插件:每一個(gè)最小功能單元都是一個(gè)插件,它可以是可見(jiàn)的,也可以是不可的,也可以是動(dòng)態(tài)變化的。比如時(shí)間、電池電量、網(wǎng)絡(luò)連接、信號(hào)強(qiáng)弱、新事件(如SMS、MMS、EMAL、ALARM和未接電話等)、應(yīng)用程序快捷方式、左右操作按鈕和其它處理系統(tǒng)事件的功能單元。每個(gè)插件都用一個(gè).desktop來(lái)描述,這是遵循freedesktop.org的標(biāo)準(zhǔn)的。

              桌面框架包括:狀態(tài)欄、開(kāi)始菜單、操作欄、桌面區(qū)、事件管理器和主題管理器。而狀態(tài)欄、開(kāi)始菜單、操作欄、桌面區(qū)和事件管理器都是容器,容納各種插件。對(duì)于可見(jiàn)的插件,可以有自己的表現(xiàn)方式,也可以采用通用的表現(xiàn)方式。

              公共函數(shù)庫(kù):一些抽象的類、實(shí)現(xiàn)插件的輔助類以及其它一些可能被公用的類。

              插件接口:對(duì)于不可見(jiàn)的插件要求實(shí)現(xiàn)事件處理功能,可見(jiàn)的插件還要求實(shí)現(xiàn)繪制功能。

              3. 模擬器設(shè)計(jì)

              一個(gè)同事負(fù)責(zé)設(shè)計(jì)另外一個(gè)平臺(tái)的PC模擬環(huán)境設(shè)計(jì)。在我的建議下,他對(duì)架構(gòu)作了調(diào)整。調(diào)整后的架構(gòu)非常簡(jiǎn)單,也可以認(rèn)為是插件式的設(shè)計(jì),它由下面幾部分組成:

              應(yīng)用程序框架:負(fù)責(zé)模擬器基本功能,如模擬鍵盤和顯示設(shè)備、換膚功能等。

              插件:就是被模擬的平臺(tái),如microwindow及相應(yīng)的手機(jī)應(yīng)用程序。盡管運(yùn)行時(shí)通常只有一個(gè)插件運(yùn)行,這樣做仍然有意義,如果要換成minigui或者其它平臺(tái)時(shí),模擬器不需要作任何修改。

              公共函數(shù)庫(kù):它由應(yīng)用程序框架初始化一些信息和回調(diào)函數(shù),然后供插件(即microwindow)調(diào)用,插件利用它來(lái)實(shí)現(xiàn)顯示和輸入等驅(qū)動(dòng)程序。

              插件接口:如起動(dòng)和停止模擬平臺(tái)等。

              4. GIMP

              GIMP是一個(gè)功能強(qiáng)大的圖形圖像編輯器,典型的基于插件式的設(shè)計(jì),在《unix編程藝術(shù)》中,作為插件式設(shè)計(jì)示例介紹過(guò)。

              應(yīng)用程序框架:GUI

              插件:完成圖像的各種轉(zhuǎn)換和處理功能,如模糊、去斑和色彩調(diào)整等。

              公共函數(shù)庫(kù):放在libgimp.so里。

              插件接口:對(duì)GIMP感興趣的朋友,可以到官方網(wǎng)站上去閱讀更多的文檔。
            posted @ 2007-06-08 16:01 cloud 閱讀(1399) | 評(píng)論 (0)編輯 收藏

            用http傳輸?shù)臅r(shí)候要注意,在傳輸是最好傳輸字符串,而不是二進(jìn)制串, 應(yīng)為二進(jìn)制串可能包含很多控制字符, 這樣就不利于傳輸了.
            一個(gè)可行的方案是用base64編碼, 然后查找編碼后的串中是否有'+', 如果有可以替換成'-'(因?yàn)槿绻惶鎿Q,在http的post或者get方式獲得數(shù)據(jù)的時(shí)候, '+' 會(huì)變成' '), 這樣就可以傳輸了

            posted @ 2007-06-04 14:32 cloud 閱讀(453) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共3頁(yè): 1 2 3 
            久久人人爽人人澡人人高潮AV| 久久丝袜精品中文字幕| 日本人妻丰满熟妇久久久久久| 日日躁夜夜躁狠狠久久AV| 久久精品国产亚洲网站| 久久综合九色欧美综合狠狠| 久久国产免费直播| 久久久久久久尹人综合网亚洲| 久久99精品国产麻豆蜜芽| 欧美一区二区久久精品| 久久综合给久久狠狠97色| 日韩一区二区久久久久久| 大香伊人久久精品一区二区| a级成人毛片久久| 久久AV高潮AV无码AV| 久久亚洲国产欧洲精品一| 亚洲精品无码久久不卡| 久久久久久综合一区中文字幕| 少妇熟女久久综合网色欲| 色综合久久久久网| 久久ZYZ资源站无码中文动漫| 久久久久亚洲AV无码专区网站| 99精品久久精品一区二区| 亚洲一级Av无码毛片久久精品| 色综合久久88色综合天天| 国产婷婷成人久久Av免费高清 | 欧美午夜精品久久久久免费视 | 久久久国产精华液| 久久精品三级视频| 国产精品免费久久| 人人狠狠综合久久亚洲婷婷| 久久久久免费看成人影片| 久久国产劲爆AV内射—百度| 国产成人综合久久精品红| 久久久久亚洲AV成人网人人网站| 久久久久国产一级毛片高清版| 久久国产精品一国产精品金尊 | 久久久久亚洲AV无码观看| 伊人 久久 精品| 中文字幕乱码久久午夜| 久久亚洲欧美国产精品|