已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
碩士學(xué)位論文 (專業(yè)學(xué)位) 內(nèi)核無關(guān)的數(shù)據(jù)驅(qū)動組件式游戲引擎架構(gòu) 姓 名: 李錚 學(xué) 號: 1021170025 所在院系:軟件工程學(xué)院 職業(yè)類型: 專業(yè)領(lǐng)域: 指導(dǎo)教師:賈金原 副指導(dǎo)教師: 肖廣 二 一 三 年 六 月 A in 2010 2013i 1021170025 摘要 現(xiàn)代的游戲產(chǎn)業(yè)經(jīng)過了多年的發(fā)展,已經(jīng)從一種簡單的娛樂形式轉(zhuǎn)變?yōu)槎鄻踊蟊娀姆蠆蕵纺J?。游戲的類型不?地增加,受眾面的覆蓋越來越廣,游戲平臺也開始由傳統(tǒng)的電腦與游戲主機(jī)擴(kuò)展到手機(jī)等非專用平臺上。隨著市場的不斷擴(kuò)大,用戶對于游戲的 要求也越來越高,競爭也日漸激烈。游戲開發(fā)商必須要持續(xù)不斷地推出高質(zhì)量的新作以維持市場地位, 并且新作必須盡量多的覆蓋各種主流游戲平臺。 然而游戲質(zhì)量的高要求帶來了開發(fā)周期的延長 與緊湊的發(fā)售日程之間的矛盾日益尖銳 ,這對他們帶來了很大的制作開發(fā)壓力。 目前的主流游戲引擎為了提高開發(fā)效率,都具備了開發(fā)流程中各個環(huán)節(jié)的配套工具 ,這些工具中最重要的便是游戲編輯器 。 但是 現(xiàn)有引擎框架中編輯器 功能針對性 強(qiáng) , 可復(fù)用性低,在實(shí)際游戲開發(fā)中往往需要根據(jù)內(nèi)核針對性的開發(fā)專門的編輯控件,從而導(dǎo)致開發(fā)效率低下并且維護(hù)困難 。 針對這種情況, 我們需要改進(jìn)現(xiàn)有的架構(gòu),做到讓編輯器 獨(dú)立存在 且 不需要 在 內(nèi)核的改動 是 進(jìn)行 人工 修改 ,以達(dá)到提高實(shí)際游戲開發(fā)制作效率的目的。 本文以實(shí)際游戲項(xiàng)目為背景,設(shè)計并開發(fā)了一套基于 數(shù)據(jù)驅(qū)動模式的 動態(tài)化組件結(jié)構(gòu)的游戲引擎與配套編輯器的架構(gòu)模式。 該架構(gòu)模式 通過分離出游戲內(nèi)核邏輯,做到 內(nèi)核無關(guān),使得 諸如 編輯器等 引擎配套工具不依賴于內(nèi)核代碼,而是通過接口規(guī)則動態(tài)匹配 并生成 編輯控件 ,達(dá)到 在不同項(xiàng)目切換環(huán)境下的 自動適應(yīng) 。此外,還能 提高數(shù)據(jù)兼容性與容錯度。 使得編輯器的游戲資源制作與本地代碼開發(fā)可以同步執(zhí)行,大大提高了游戲制作的效率?;跀?shù)據(jù)驅(qū)動的架構(gòu)也使得維護(hù)與版本升級更加容易與安全。 關(guān)鍵詞 : 游戲引擎, 數(shù)據(jù)驅(qū)動,組件式架構(gòu),類型數(shù)據(jù)庫 目錄 第一章 引言 . 6 題的研究背景與意義 . 6 戲引擎的發(fā)展 . 6 內(nèi)外發(fā)展現(xiàn)狀 . 7 文主要研究內(nèi)容與組織結(jié)構(gòu) . 10 第二章 引擎架構(gòu)概述 . 11 構(gòu)的設(shè)計理念 . 11 計概念和設(shè)計特色 . 11 塊結(jié)構(gòu) . 11 于組件的游戲?qū)嶓w結(jié)構(gòu) . 13 型數(shù)據(jù)庫 . 15 語定義 . 16 章小結(jié) . 17 第三章 引擎數(shù)據(jù)架構(gòu)的設(shè)計 . 18 計目標(biāo)與結(jié)構(gòu)組成 . 18 展 統(tǒng)設(shè)計 . 20 用運(yùn)行時類型識別 . 20 計思想的結(jié)合 . 21 應(yīng)用 . 22 管封裝與創(chuàng)建托管實(shí)例的實(shí)現(xiàn) . 23 心功能的封裝與實(shí)例化 . 23 型的封裝與實(shí)例化 . 24 章小結(jié) . 25 第四章 核心數(shù)據(jù)系統(tǒng)的設(shè)計 . 26 計目標(biāo) . 26 展的類型元信息與屬性數(shù)據(jù)的設(shè)計 . 27 冊屬性信息的 實(shí)現(xiàn) . 27 象與屬性信息的序列化與反序列化實(shí)現(xiàn) . 29 象的序列化 . 29 性信息的序列化 . 30 章小結(jié) . 31 第五章 動態(tài)編輯器組件的設(shè)計 . 32 計目標(biāo) . 32 心數(shù)據(jù)流的整合應(yīng)用 . 32 性接口的實(shí)現(xiàn) . 33 戲?qū)ο蟮臉湫谓M成結(jié)構(gòu) . 33 種策略的設(shè)計與對比 . 34 件與數(shù)據(jù)綁定 . 35 礎(chǔ)編輯控件的選擇 . 35 性接口類的實(shí)現(xiàn)與編輯控件擴(kuò)展 . 36 章小結(jié) . 37 第六章 結(jié)論與展望 . 38 論 . 38 一步的工作方向 . 38 參考文獻(xiàn) . 39 第一章 引言 題的研究背景與意義 一個軟件的架構(gòu),是指其 在組件,彼此間和與環(huán)境間的關(guān)系,引 導(dǎo)設(shè)計發(fā)展原則中體現(xiàn)的系統(tǒng)的基本結(jié)構(gòu)。 它是一個軟件系統(tǒng)從整體到部分的最高層次的劃分,一個系統(tǒng)通常是由元件組成的,而這些元件如何形成、相互之間如何發(fā)生作用,則是關(guān)于這個系統(tǒng)本身結(jié)構(gòu)的重要信息。 可以說軟件架構(gòu)是軟件的大局規(guī)劃,為具體開發(fā)提供指導(dǎo)與限制, 它的設(shè)計決定了這個軟件的功能結(jié)構(gòu) 與擴(kuò)展?jié)撃堋?現(xiàn)有 主流的游戲引擎的前身都是一些成功的游戲項(xiàng)目, 由于其核心在游戲中表現(xiàn)出色被人所接受,于是便在其之上構(gòu)建出的一套完整的引擎系統(tǒng)。 這些引擎的著重點(diǎn)都在于游戲應(yīng)用的性能而對于開發(fā)便利度不夠重視,其次它們的架構(gòu)針對性很強(qiáng)可塑 性差,在原型以外的游戲 類型中 應(yīng)用 難度 很大 靈活性很低 , 進(jìn)而 影響到了開發(fā)效率 。 所以 本文針對這些問題,旨在通過優(yōu)化引擎架構(gòu)的方式,改良游戲引擎在開發(fā)中的通用型與靈活性。 通過這些改進(jìn) 來提升引擎在游戲項(xiàng)目中的開發(fā)效率與易用性。 戲引擎的發(fā)展 早期的游戲引擎大多數(shù)以功能庫的形式存在,當(dāng)時的游戲開發(fā)者將現(xiàn)有的代碼進(jìn)行整合,從中抽離出可復(fù)用的模塊,以達(dá)到減少重復(fù)工作、提高開發(fā)效率的目的。這些功能庫一般涵蓋了圖形、數(shù)學(xué)、內(nèi)存與線程管理、資源管理、聲效、物理與網(wǎng)絡(luò)等底層功能。這些庫涵蓋了每個游戲所必須的功能,其性能 優(yōu)劣直接影響到游戲的表現(xiàn)。性能優(yōu)秀的底層引擎會非常受到游戲開發(fā)者的歡迎,因此,便出現(xiàn)了職業(yè)的游戲引擎開發(fā)者。 早期的游戲引擎無論性能多么強(qiáng)大,其面對的用戶都是程序員。隨著游戲場景與關(guān)卡邏輯的日漸復(fù)雜,轉(zhuǎn)職的游戲設(shè)計師(策劃)加入到游戲開發(fā)中來。這些設(shè)計師通常缺乏編程功底,因此為了讓他們能夠高效的工作,便開始采用使用所見即所得( s 式的編輯器來進(jìn)行關(guān)卡編輯。 設(shè)計師通過編輯器能夠直接使用游戲資源構(gòu)建場景,放置美術(shù)資源與邏輯觸發(fā)器等。 一些 游戲 的關(guān)卡編輯器完善的功能與簡單的操作讓非專業(yè)人士也能輕松使用,甚至 會將 其公開 讓玩家也能創(chuàng)建自定義關(guān)卡。 于是,關(guān)卡編輯器現(xiàn)在已經(jīng)成為了游戲引擎不可或缺的一部分。 對于商業(yè)引擎而言,開發(fā)者不會使用引擎自帶的美術(shù)與邏輯資源, 因此引擎都會帶有配套的資源管線工具來處理資源,以及專門的腳本系統(tǒng)來擴(kuò)充游戲邏輯。 較高端的引擎如 使用可視化狀態(tài)機(jī)來簡化部分 腳本 邏輯的編輯操作 ,或者引入了動態(tài)的腳本對象編輯工具(如 。 腳本級的功能擴(kuò)展 非常 有限,并且依賴于內(nèi)核代碼并受到其限制 ,因此 部分引擎(如 了進(jìn)一步增強(qiáng)擴(kuò)展性會開放部分 內(nèi)核 。 這樣雖然給游戲本身的 功能實(shí)現(xiàn) 大大的增加了靈活性, 不過 為了 使用這些新加入的自定義功能, 將 它們 反映到編輯器上 ,仍然需要 額外 實(shí)現(xiàn)對應(yīng)的編輯器腳本 甚至 使用編輯器 構(gòu)建編輯控件。 圖 擎編輯 器界面 內(nèi)外發(fā)展現(xiàn)狀 游戲引擎隨著技術(shù)的發(fā)展越來越成熟,其功能區(qū)域完善的同時也變得愈發(fā)復(fù)雜。 現(xiàn)今的商業(yè)引擎越來越作為一個獨(dú)立的產(chǎn)品來運(yùn)作而不是像早期引擎那樣 作為 一個游戲的定制核心組件存在。 其運(yùn)作方式主要有兩種:一種 是引擎配合 完整的工具與資源管線,利用場景編輯器導(dǎo)入美術(shù)資源并在現(xiàn)有框架上用腳本構(gòu)建游戲邏輯,使用配套工具完成整個游戲的制作。 另一種是將內(nèi)核按功能點(diǎn)來提供源 代碼,用類似于第三方插件的形式以模塊的形式來銷售 。 對于 免費(fèi) /非商業(yè)引擎而言,由于無法做到大成本的開發(fā)投入,。雖然通過完全開源能夠吸引 獨(dú)立開發(fā)者共同完善,但整體效果與配套周邊仍無法與商業(yè)引擎相比,因此往往用于小型游戲或者教育實(shí)驗(yàn)領(lǐng)域。 以下是當(dāng)今三種有代表性的引擎對比; 業(yè)性質(zhì) 完全免費(fèi) 免費(fèi)使用 購買套件與發(fā)布許可 收費(fèi) (對非商業(yè)使用免費(fèi)開放 購買各平臺發(fā)布許可 源碼 開源 不公開 按模塊購買 功能 底層核心功能 完整開發(fā)管線 完整開發(fā)管線 平臺 移動平臺 多平臺 移動為主 多平臺 主 開發(fā) 調(diào)用 底層代碼 不同平臺使用不同語言 使用編輯器 兼 容多種語言的 使用編輯器 獨(dú)立語法的 本 ,帶可視化編輯 根據(jù)授權(quán)開放底層代碼 擴(kuò)展 大量免費(fèi)的第三方擴(kuò)展版本 提供 第三方腳本與資源 共享平臺 提供 為單個游戲進(jìn)行引擎定制 工具 少量第三方工具 自帶全部工具 支持開發(fā)編輯器組件 自帶全部工具 支持開發(fā)編輯器組件 表 種有代表性的引擎對比 這三個引擎從邏輯架構(gòu)而言, 為針對小型手機(jī)游戲的引擎,沒有提供上層架構(gòu),需要開發(fā)者自行實(shí)現(xiàn)。 用了數(shù)據(jù)驅(qū)動的模塊化腳本,開發(fā)便利但是完全無法接觸底層功能,應(yīng)用非 常受限。 供了可視化腳本編輯,但是其游戲邏輯都是針對 現(xiàn)的, 如果有額外要求,必須購買源碼來進(jìn)行引擎定制。 就 技術(shù) 趨勢來看 , 當(dāng)代的引擎 逐漸都 采用了數(shù)據(jù)驅(qū)動和模塊化的設(shè)計 模式 。 數(shù)據(jù)驅(qū)動編程是一種設(shè)計思想,在這種思想中,數(shù)據(jù)不僅僅是描述某個對象的狀態(tài),實(shí)際上還定義了程序的流程。 11其最初的核心是認(rèn)為,數(shù)據(jù)比程序邏輯更容易駕馭,因此要盡可能把設(shè)計的復(fù)雜度從代碼轉(zhuǎn)移到數(shù)據(jù)上。 將抽象數(shù)據(jù)類型設(shè)計思想融合到面向?qū)ο缶幊讨?,就形成了?shù)據(jù)驅(qū)動的的設(shè)計思路 13,其優(yōu)勢在于: 1 - 可讀性更強(qiáng),消息 處理流程一目了然。 2 - 更容易修改,要增加新的消息,只要修改數(shù)據(jù)即可,不需要修改流程。 3 - 重用,避免 重復(fù)的數(shù)據(jù)與代碼,讓代碼更精簡。 最基礎(chǔ)的數(shù)據(jù)驅(qū)動游戲設(shè)計將游戲邏輯儲存在數(shù)據(jù)文件中由運(yùn)行時實(shí)例化,而非內(nèi)嵌在代碼里。這些數(shù)據(jù)包含關(guān)卡設(shè)計和腳本等,可以由工具來生成。通過使用關(guān)卡編輯器等工具制作游戲數(shù)據(jù)能夠大幅的節(jié)省時間,降低開發(fā)門檻,讓更專注于游戲過程的設(shè)計師在制作中減少對程序員的依賴。 除此之外更高級的數(shù)據(jù)驅(qū)動設(shè)計將本地代碼功能原子化抽象化,把控制流放在數(shù)據(jù)中,使得引擎可以滿足不同需求的復(fù)雜環(huán)境。其 次,低耦合的結(jié)構(gòu)降低了代碼的依賴性,能夠讓開發(fā)工作的分工更明確且更具針對性。當(dāng)代引擎中, 采用了將邏輯代碼腳本化的設(shè)計,通過腳本的驅(qū)動來連接關(guān)卡數(shù)據(jù)和本地代碼來實(shí)現(xiàn)這種高級數(shù)據(jù)驅(qū)動特性。 組件化編程 ( 很早就實(shí)用于游戲開發(fā)中,第三方中間件就是一個典型的例子。游戲開發(fā)者在加載中間件后,直接通過固定接口來調(diào)用這些模塊的功能操作 負(fù)責(zé)處理游戲中的一個特定功能 。與此同時,中間件的開發(fā)者保持其模塊的持續(xù)優(yōu)化與更新,使得 游戲開發(fā)者無需對自己的代碼進(jìn)行調(diào)整就可以使用到最新的功能。 對象管理小組( “建模語言規(guī)范”中將組件定義為:“系統(tǒng)中一種物理的、可代替的部件、它封裝了實(shí)現(xiàn)并提供了一系列可用的接口。一個組件代表一個系統(tǒng)中實(shí)現(xiàn)的物理部分,包括軟件代碼(源代碼,二進(jìn)制代碼,可執(zhí)行代碼)或者一些類似內(nèi)容,如腳本或者命令文件?!?2008組件化程序設(shè)計結(jié)構(gòu)是為了解決軟件復(fù)用,縮短開發(fā)時間,降低維護(hù)成本和實(shí)現(xiàn)程序 動態(tài)升級而出現(xiàn)的。其核心概念是接口,目的是粗粒度的復(fù)用,以滿足應(yīng)用程序定制與快速應(yīng)用程序開發(fā)。 同面向?qū)ο缶幊?(比,面向組件編程是一種組織代碼的思路,將系統(tǒng)看作一個個的組件,通過定義組件之間的寫過關(guān)系來完成系統(tǒng)地構(gòu)建。在屬性和事件等更高級的概念支撐下,解決了面向?qū)ο蠹夹g(shù)中類依賴、消息傳遞問題,滿足了組件的物理獨(dú)立性和粗粒度的復(fù)用。 現(xiàn)代化的可服用組件已經(jīng)同時涵蓋了數(shù)據(jù)結(jié)構(gòu)以及引用在其上的算法,它們建立在面向?qū)ο笤O(shè)計中的對象、架構(gòu)、框架與設(shè)計方法等理論上,使得軟件組件如同通信硬件組件一般能夠不受限制的 組合使用。 19 基于組件的游戲引擎, 不僅僅是要 將引擎的底層實(shí)現(xiàn)進(jìn)行模塊化,上層的邏輯組成部分也 需要 進(jìn)行了組件化。 游戲的邏輯實(shí)體 不再自行實(shí)現(xiàn)行為,而是將行為組件化 ,通過行為組件的組合來實(shí)現(xiàn)一個獨(dú)立的實(shí)體。 組件的組合可以直接在引擎編輯器中完成,不需要單獨(dú)的編碼工作,這大大的簡化了邏輯制作的復(fù)雜度。 以 例,它是較早實(shí)現(xiàn)用戶 邏輯數(shù)據(jù)完全組件化的引擎之一 ,用戶腳本中的類型繼承 口后會被編譯為腳本組件 ,附加于游戲物體上之后便能夠直接操作該物體,從而實(shí)現(xiàn)游戲邏輯。 文主要研究內(nèi)容與組織結(jié)構(gòu) 本文旨在構(gòu)建一種引擎架構(gòu) (暫名 數(shù)據(jù) 類型 組件框架 ,研究的重點(diǎn)在于架構(gòu)的組織 設(shè)計 、模塊分配管理、 重點(diǎn)模塊的設(shè)計與實(shí)現(xiàn)、 以及相對應(yīng)的資源管理部份。 本文的組織如下: 第二章對整個引擎的架構(gòu)做一個簡單的介紹 引擎 概述 第三章介紹 引擎的類型 數(shù)據(jù)庫 第 四 章介紹 核心數(shù)據(jù)流 第五 章介紹 組件化邏輯結(jié)構(gòu)與 動態(tài) 編輯器 組件的實(shí)現(xiàn) 第六 章對全文做一個總結(jié)和展望 總結(jié) 第二章 引擎架構(gòu) 概述 構(gòu)的設(shè)計理念 本課題 著眼于改進(jìn)現(xiàn)有 引擎架構(gòu)以使得其能夠保持開發(fā)的低成本與高效率以滿足 對游戲開發(fā)的日程、預(yù)算有高要求的開發(fā)環(huán)境。 針對游戲引擎的內(nèi)核與編輯器等工具之間的架構(gòu)關(guān)系進(jìn)行優(yōu)化 , 旨在提高引擎在不同項(xiàng)目之間的通用性與重用效率 ,以達(dá)到實(shí)用一套引擎開發(fā)多類產(chǎn)品的目的 。 引擎架構(gòu)暫名為數(shù)據(jù)類型組件框架( 顧名思義其實(shí)現(xiàn)的核心 思想 是將 類型數(shù)據(jù)化,再把 數(shù)據(jù)轉(zhuǎn)化為游戲組件 嵌入到框架中 ,以數(shù)據(jù)驅(qū)動的形式解決內(nèi)核與工具耦合度的問題 。 因此,這個引擎架構(gòu)應(yīng)當(dāng)包含如下特性: 含有核心接口規(guī)則,所有 的模塊均需要支持此接口。 使用專門的 塊 為所有的模塊 提供底層支持 。 使用本地非托管代碼提供底層功能支持。 并利用托管模塊進(jìn)行封裝到塊中。 塊 獨(dú)立存在 ,使用不同的啟動器以不同的模式啟動 ,包括托管服務(wù)模式與獨(dú)立運(yùn)行模式 。 塊中會為所有的行為定義編輯接口 ,并在特定的服務(wù)模塊中注冊。 編輯器將針對這些編輯接口進(jìn)行解析并動態(tài)生成編輯控件 。 游戲關(guān)卡資源均以數(shù)據(jù) 字段 ( 的形式存在 。 其存在不依賴于 控件 或本地屬性 編輯器控件在載入數(shù)據(jù)字段時將進(jìn)行反序列 化的解析與糾錯。 計概念和設(shè)計特色 塊 結(jié)構(gòu) 據(jù)功能和代碼實(shí)現(xiàn)特性,劃分為多個模塊。 每個模塊在代碼中都是以獨(dú)立的工程實(shí)現(xiàn)存在的。 一個模塊有可能包含多個工程,工程可以是靜態(tài)的類庫,也可以是輸出 獨(dú)立可執(zhí)行程序。 本架構(gòu)的模塊結(jié)構(gòu)劃分如下: I E n g i n eG s I n t e r f a c eE i n g i e B a s eE n g i n e N a t i v eE n g i n e W r a p p e rE n g i n e I n t e r f a c e ( C L R )G s W r a p p e rG s C o m p o n e n t B o o t N a t i v eB o o t T o o l F r a m e w o r kB o o t C L 擎模塊架構(gòu)圖 按照層次劃分,從下到上可分為:基礎(chǔ)層, 本地 層,接口層,應(yīng)用層 。 基礎(chǔ)層 基礎(chǔ)層 即圖表中的 塊 ,這個模塊將被本地層所引用 。 它 負(fù)責(zé)處 理所有的底層 功能 , 例如渲染、內(nèi)存、數(shù)學(xué)等 游戲運(yùn)行提供必須的 部分 。 這些功能往往和平臺有緊密聯(lián)系 , 因此為不同平臺針對性的做實(shí)現(xiàn), 在編譯和運(yùn)行時根據(jù)平臺來加載對應(yīng)的模塊來為 上層提供服務(wù)。 本地層 本地 層 的內(nèi)容主要為 游戲特定( 的代碼實(shí)現(xiàn) 。 專門針對當(dāng)前項(xiàng)目使用 功能模塊, 這些模塊針對性非常強(qiáng)因此 基本不會被重用 。 它們可以作為功能點(diǎn)、庫 或者 服務(wù)的形式存在 。 部分 功能,例如物理在實(shí)際使用中會對 的類型有引用依賴,因此這些功能會在 保留一個專門 的 封裝 接口 來保持其獨(dú)立 性。 本地層中除了實(shí)現(xiàn) 能之外,還需要對 定義的 服務(wù)接口( 進(jìn)行代碼實(shí)現(xiàn)。 這些 服務(wù)接口不會直接依賴于 地的服務(wù)在實(shí)現(xiàn)后,只需要在服務(wù)接口中注冊即可。 接口層 接口層包含 大功能模塊。 這一層會被大部分的功能模塊所引用。 來定義模塊所需要提供的服務(wù) ,其中并不包括具體實(shí)現(xiàn) ,而是加載本地層中的模塊來提供給更上層使用。 責(zé)對本地層 的接口進(jìn)行 托管封裝。 本地的 C+代碼在利用托管 的C+/裝后支持 使用特性 ,便可以在 境下(例如場景編輯器等工具)直接使用。 應(yīng)用層 應(yīng)用層 不包含任何 內(nèi)容 ,其中的模塊都會動態(tài)的讀取 本地的或者塊封裝好的 接庫,并通過特定接口訪問本地模塊中的功能。 直接加載本地代碼啟動引擎,即為直接獨(dú)立運(yùn)行游戲本身。 通過 修改 啟動參數(shù)來加載數(shù)據(jù)包。 為啟動編輯器。 編輯器會加載進(jìn)行過 裝的本地代碼,并通過分析服務(wù)接口來獲取本地類型的注冊信息, 這些信息會被用來動態(tài)創(chuàng)建編輯器 組件 。 為使用托管方式啟動游戲,一般會內(nèi)嵌在編輯器中 ,為所見即所得的編輯模式服務(wù)。 于組件的游戲 實(shí)體 結(jié)構(gòu) 組件化編程是現(xiàn)在大型軟件架構(gòu)的常用編程思想。 在游戲開發(fā)中,最典型的組件化編程即為將程序按照功能劃分為組件模塊 ,然后通過接口來調(diào)用組件的方法。 除了這些傳統(tǒng)的核心模塊組件化編程應(yīng)用之外,游戲開發(fā)中還將基于組件的思想應(yīng)用在了邏輯組織部分 ,這就是將游戲 實(shí)體 也進(jìn)行組件化設(shè)計。 游戲?qū)嶓w ( 是指在游戲運(yùn)行時, 在游戲世界中 獨(dú)立存在的 一個邏輯 實(shí)體 ,也是游戲世界的基本構(gòu)成部分 。 游戲?qū)嶓w可以使任何東西,既可以是玩家、 制的角色,也可以是靜態(tài)的模型、物理碰撞體,甚至燈光和特效,這些都是游戲?qū)嶓w。 每個實(shí)體有著自己的行為,可以同其他實(shí)體進(jìn)行交互 但是并不會有直接依賴關(guān)系。 在傳統(tǒng)的面向?qū)ο缶幊趟枷胫?,一個實(shí)體就是一個對象,在代碼中表現(xiàn)為一個類的實(shí)例 ,實(shí)體的行為就是類的方法 。 對象類往往從一個基類擴(kuò)展而來,逐步的派生 并細(xì)化、重寫方法以滿足不同對象所必要的特征。 這種面向?qū)ο蟮姆椒梢院唵斡行У慕鉀Q游戲邏輯制作的要求,但是,在高度復(fù)雜的次世代游戲開發(fā)環(huán)境中,便會遇到很多問題,例如: 派生 是一個樹形結(jié)構(gòu) ,一旦當(dāng)前類型不能解決問題,便需要派生出一個子類來 重寫部分方法 。 隨著需求復(fù)雜度的提升,這個樹形結(jié)構(gòu)會變得極其復(fù)雜臃腫,類型的數(shù)量大幅增加。 樹形派生結(jié)構(gòu)的特性使得上層的類型無法隨意修改, 直接導(dǎo)致維護(hù)困難 。 類型的方法調(diào)用受到基類(接口)的限制 , 會遇到需要因?yàn)?擴(kuò)充調(diào)用機(jī)制 而修改接口的情況,這 將會破壞接口的封裝性并導(dǎo)致接口變得臃腫。 行為的細(xì)節(jié)均在本地實(shí)現(xiàn), 配置不靈活, 開發(fā)效率低,難以重用。 因此,為了克服面向?qū)ο箝_發(fā)中出現(xiàn)的這些弊端, 對于游戲?qū)嵗M(jìn)行組件化設(shè)計 是很有必要的。 + U p d a t e ( )G a m e E n t i t y+ U p d a t e ( )C h a r a c t e r+ U p d a t e ( )+ I n p u t ( )P l a y e r+ U p d a t e ( )+ A i U p d a t e ( )E n e m y+ A i U p d a t e ( )+ D o A c t i o n ( )S o i l d e r+ A i U p d a t e ( )+ D o A c t i o n ( )+ D o C o m m a n d ( )O f f i c e r+ D o C o m m a n d ( )+ M a k e O r d e r ( )G e n e r a l+ U p d a t e ( )+ U p d a t e C o m p o n e n t s ( )- C o m p o n e n t C o n t a i n e rG a m e E n t i t o c a t i o n C o m p o n e n i s p l a y C o m p o n e n t o c i g a l C o m p o n e n t n p u t C o m p o n e n t h y s i c s C o m p o n e n t . .C o m p o n e n t C o n t a i n e rB a s e C o m p o n e n tL o g i c a l C o m p o n e n tP h y s i c s C o m p o n e n tS i m p l e C h a r a c t e r C o m p o n e n 向?qū)ο蟮膶?shí)體結(jié)構(gòu)與基于組件的實(shí)體結(jié)構(gòu)對比 在這種結(jié)構(gòu)中,游戲?qū)嶓w作為組件的容器存在,自身不包含任何邏輯。 組件對于實(shí)體而言是獨(dú)立抽象的, 游戲?qū)嶓w會在自身的 法中,調(diào)用每個組件的 作。 同時負(fù)責(zé)游戲世界與組件之間的消息接口。 每個 立存在,其之間沒有強(qiáng)制性關(guān)聯(lián)。 實(shí)體本身不帶有任何組件,組件都以自由組合的形式 動態(tài)的添加 。在實(shí)體初始化的時候,將會根據(jù)組合規(guī)則將所需要的組件全部初始化并加入 到 實(shí)體的組件容器 (組件池) 中。 組件的組合規(guī)則包括這個實(shí)體含有哪些組件,以及這些組件的初始參數(shù)、標(biāo)簽、注冊信息等 。 這些 組件信息 都 會被保存在數(shù)據(jù)文件中 ,這些數(shù)據(jù)文件由編輯器生成和修改 的 。 雖然組件都是獨(dú)立存在自由組合的,但是有一些負(fù)責(zé)特定功能的組件會帶有一些特殊性質(zhì)。例如一些組件是必須唯一 不能重復(fù) 的, 或者是游戲?qū)嶓w中必 要 的單例組件你。 例如位置 組件 、渲染器 組件 等。 這些組件就必須從組件池里抽離出來,單獨(dú)設(shè)立接口 , 當(dāng)游戲?qū)嶓w被創(chuàng)建時,自動加入這些組件。 另外, 組件與實(shí)體相互依賴、組件之間有互斥規(guī)則的, 比如物理 組件、消 息組件等 。 這類組件也需要從組件池里抽離出來,并建立一個獨(dú)立的專用組件池,利用特定的規(guī)則來維護(hù)。 型數(shù)據(jù)庫 類型數(shù)據(jù)庫 (一個引擎內(nèi)部的,用來存放所有注冊類信息的數(shù)據(jù)庫。其作用是讓程序能夠隨時獲得通過類型名來獲取對應(yīng)注冊類的類型信息,從而達(dá)到動態(tài)創(chuàng)建類型對象的目的。 在本引擎架構(gòu)中,類型數(shù)據(jù)作為一個服務(wù)存在,并利用 裝之后,支持 性,同時提供給本地和托管端(關(guān)卡編輯器等工具)的使用。 類型都在引擎的本地代碼中實(shí)現(xiàn),并在數(shù)據(jù)庫的初始 化時調(diào)用類型的注冊操作,因此這會對本地代碼有依賴,屬于 本地層模塊。 塊需要一個專門的 對其進(jìn)行封裝,并暴露出必要的借口函數(shù)。這個 是對 依賴的,但由于在 會被動態(tài)載入并反射創(chuàng)建數(shù)據(jù)庫實(shí)體,因此只需要在這一步定義一個操作接口,就不會破壞其封裝性或者造成循環(huán)依賴。 類型數(shù)據(jù)庫的實(shí)現(xiàn)細(xì)節(jié)會在后續(xù)章節(jié)詳細(xì)描述。 語定義 本文用到了大量的專業(yè)術(shù)語,部分詞匯在本文中的含義和常見解釋有少許區(qū)別,因此在這里進(jìn)行解釋以避免誤解。 ” 運(yùn)行庫。在本文中,使用 C#或者 C+/發(fā)的,支持 性的模塊,均被劃分為“ 碼”。使用非 言開發(fā)的,例如 C+,被劃分為“本地代碼( 。 類 /類型 / 這三個詞都是用來描述面向?qū)ο缶幊讨蓄惖母拍?。為了避免混淆,在本文中,“類”是專指代碼中的一個 現(xiàn);“類型”是對于 抽象和廣義的統(tǒng)稱; 特指 的 ,每個 型都含有其象,其中包含了類型的元信息。 全稱 “縮寫,指為特定一個游戲服務(wù)的代碼或功能模塊。如果一個模塊是 ,就意味著它只為某個或某幾個特定的項(xiàng)目服務(wù),是具體、非通用的。 塊會根據(jù)項(xiàng)目開發(fā),有可能是全新實(shí)現(xiàn)的,也有可能是對于現(xiàn)有的非 塊的改寫與擴(kuò)展。例如:一個人形角色的骨骼邏輯可以是非 ,但一種特殊怪獸的骨骼邏輯由于其非通用的針對性,就是一個 能點(diǎn)。 在本引擎中, 務(wù))的定義比較寬泛:全局的 ,提供特定功能支持的,都可以算作 通常意義上的服務(wù)不同,這些服務(wù)往往會對與本地代碼有依賴,因此不會嚴(yán)格遵照接口規(guī)則工作,而是通過在務(wù)提供者,服務(wù)工廠)中注冊與請求來使用。 由于兩者中文直譯都是資源,為了區(qū)分,將 譯為“資源”,將 譯為“資產(chǎn)”。 - 資產(chǎn)( 般指模型、材質(zhì)、音效等美術(shù)資源,資產(chǎn)都單獨(dú)存在沒有相互的依賴。 - 資源( 這里特指邏輯資源,或者叫做策劃資源。它可以是玩家數(shù)據(jù)、管卡信息,也可以是對資產(chǎn)的引用和封裝。資源均為邏輯信息,不包含外部對象。資源之間會有依賴和引用關(guān)系。 章小結(jié) 在這一章節(jié)中,我們簡要介紹了 本地引擎的 模塊結(jié)構(gòu)與設(shè)計思想, 并對模塊功能做了簡要的描述。在接下來的章節(jié)中,將會詳細(xì)的介紹本地模塊 中 最重要的類型數(shù)據(jù)庫的實(shí)現(xiàn)。 第三章 引擎數(shù)據(jù)架構(gòu)的設(shè)計 類型數(shù)據(jù)庫 ( 是 核心功能之一,是實(shí)現(xiàn)數(shù)據(jù)驅(qū)動、編輯器與內(nèi)核無關(guān)的重要組成部分。 在完全面向?qū)ο蟮木幊汰h(huán)境下,類和對象已經(jīng)不僅僅是對于數(shù)據(jù)屬性和操作的封裝體,而是 作為整個程序的構(gòu)成而存在。系統(tǒng)中一切皆為對象,類型就是對于對象共同特性的劃分與抽象。在這樣的環(huán)境下,能夠隨時隨地獲得所有對象的類型信息至關(guān)重要。類型數(shù)據(jù)庫的設(shè)計目的便是為了滿足這一要求。本章就將對這一關(guān)鍵模塊的設(shè)計進(jìn)行詳細(xì)的論述。 計目標(biāo)與結(jié)構(gòu)組成 類型數(shù)據(jù)庫中的核心便是所有類型的信息,將這些信息組織起來便是類型數(shù)據(jù)庫的工作。 其在引擎中的功能便是管理所有的本地注冊類,并同時提供本地和托管的接口供所有模塊訪問,為本地內(nèi)核與編輯器提供服務(wù)。 由于在本引擎中,類型數(shù)據(jù)庫要同時支持本地代碼和編輯器代碼 , 因此 類型數(shù)據(jù)庫要在本地實(shí)現(xiàn),根據(jù)模塊劃分會有多個類型數(shù)據(jù)庫存放在不同的工程中,其實(shí)例以服務(wù)的形式儲存于引擎的服務(wù)列表里。當(dāng)引擎初始化時會掃描列表中所有的類型數(shù)據(jù)庫,收集所有的注冊類型信息并動態(tài)注冊。 對于編輯器而言,其調(diào)用本地方法的目的一般是將本地功能內(nèi)嵌到編輯器中使用。但是對于類型數(shù)據(jù)而言,其主要目的是獲取核心數(shù)據(jù)流以及數(shù)據(jù)的組織結(jié)構(gòu)。編輯器需要獲得類型的字段信息來為動態(tài)生成編輯器服務(wù),但并不需要在托管端創(chuàng)建類型的實(shí)例。 因此,類型數(shù)據(jù)庫只需要將類型的字段收集作為一段描述數(shù)據(jù),并在托管端利用這些字段生成一個容 器類作為動態(tài)生成編輯器的依據(jù)。我們將在后面章節(jié)中詳細(xì)討論與動態(tài)編輯器生生成相關(guān)內(nèi)容。 + C o n s t r u c t o r ( i n p A d d r e s s : v o i d * )+ D e s t r u c t o r ( i n p A d d r e s s : v o i d * )+ G e t N a m e ( ) : s t r i n g+ S e t N a m e ( i n n a m e : s t r i n g )+ G e t S i z e ( ) : i n t+ S e t S i z e ( i n s i z e : i n t )+ S e t B a s e C l a s s ( i n b a s e C l a s s : M e t a C l a s s )+ I s K i n d O f ( i n t a r g e t : M e t a C l a s s )- n a m e : s t r i n g- s i z e : i n tM e t a C l a s s+ R e g i s t e r A l l C l a s s ( )L i b C o n f i g+ G e t I n s t a n c e ( ) : s t a t i c C l a s s D a t a B a s e *+ A d d C l a s s ( i n m e t a C l a s s : M e t a C l a s s * )+ G e t M e t a C l a s s N u m ( ) : i n t+ G e t N a m e B y I n d e x ( ) : s t r i n g+ G e t M e t a C l a s s ( i n n a m e : s t r i n g ) : M e t a C l a s s *- m e t a c l a s s M a p : M e t a C l a s s *C l a s s D a t a B a s eI n t e r f a c e+ C r e a t e O b j e c t ( )I O b j e c tB a s e O b j e c t+ R e g i s t L i b ( )+ R e g i s t A l l C l a s s e s ( )E n g i n eW r a p p e J E C T _ C P P _ C R E A T J E C T _ H H _ C R E A T 型數(shù)據(jù)庫在本地代碼中的結(jié)構(gòu)示意 如圖所示,類型數(shù)據(jù)庫 系統(tǒng)在本地實(shí)現(xiàn),主要分為三大部分:數(shù)據(jù)庫、數(shù)據(jù)庫模塊 以服務(wù)的形式 單獨(dú)存在 , 是 本地引擎的一個組成部分。 其功能 負(fù)責(zé)保存 和管理類型的元數(shù)據(jù)信息,并提供索引查找等操作接口。 一個特制的擴(kuò)展元類 模塊。 每一個 型都需要有一個對應(yīng)的 讓它在類型數(shù)據(jù)庫中正常工作。這個對應(yīng)的 一個靜態(tài)類型,以及對應(yīng)的獲取該類型的靜態(tài)方法。這些共通的方法將被登陸在兩個宏定義中,將這兩個宏定義加入到類型的聲明中便能快速的實(shí)現(xiàn) 該 元類。 詳細(xì)方法會在后續(xù)章節(jié)中介紹。 型配置) 模塊 分布在各個 程中,用來收集和注冊當(dāng)前模塊中的類型 元 信息。 其中 法便是用來將收集的類型信息注冊到類型數(shù)據(jù)庫中的過程。 每一 個 程中的都需要根據(jù)模塊內(nèi)的類型情況重寫這個方法。 由于類型數(shù)據(jù)要為整個引擎服務(wù),因此需要在主循環(huán)啟動之前完成注冊。因此,需要在引擎初始化的時候,注冊并掃描所有的 塊,調(diào)用每個模塊的 法,完成所有元類的注冊工作。 : : I E n g i n e L i b C o n f i gR e g i s t e r A l l C l a s sC l a s s D a t a b a s eA d d M e t a C l a s s ( )R e g i s t e r L i bI n i tS c a n A l lL i b r a r i e sW r a p p e r : : C l a s s D a t a b a s eG e n e r a t e D a t a b a s e ( C L R )圖 型數(shù)據(jù)庫的初始化順序 展 統(tǒng) 設(shè)計 對于本地代碼而言,一個基礎(chǔ)的 統(tǒng) 的作用是用 來獲取類型的運(yùn)行時信息 。 但是在本引擎架構(gòu)的設(shè)計中,類型的信息除了要為本地代碼服務(wù)以外,要需要提供必要的信息給編輯器,用來作為所見即所得場景中的實(shí)例操作,以及動態(tài)的生成類型所對應(yīng)的編輯器來使用。 因此,在為本地提供信息的基礎(chǔ)上,必須 擴(kuò)展改進(jìn)傳統(tǒng)架構(gòu), 為 編輯器端的使用提供新的功能接口。 用 運(yùn)行時類型識別 通用 運(yùn)行時類型識別) 是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年安徽中醫(yī)藥高等??茖W(xué)校高職單招職業(yè)適應(yīng)性考試備考題庫有答案解析
- 2026年撫州職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試參考題庫帶答案解析
- 2026年湖南勞動人事職業(yè)學(xué)院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年湖南郵電職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考試題帶答案解析
- 2026年貴州護(hù)理職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試參考題庫有答案解析
- 2026年成都工貿(mào)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性考試備考題庫有答案解析
- 2026年安徽綠海商務(wù)職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性考試備考題庫有答案解析
- 2026年廣西農(nóng)業(yè)職業(yè)技術(shù)大學(xué)高職單招職業(yè)適應(yīng)性測試備考試題有答案解析
- 2026年福建藝術(shù)職業(yè)學(xué)院單招職業(yè)技能筆試備考試題帶答案解析
- 2026年河北工藝美術(shù)職業(yè)學(xué)院單招綜合素質(zhì)考試備考題庫帶答案解析
- DB13T 1264-2010 遠(yuǎn)程射霧技術(shù)應(yīng)用規(guī)范
- JGJT46-2024《施工現(xiàn)場臨時用電安全技術(shù)標(biāo)準(zhǔn)》條文解讀
- 員工獎勵申請表格模板(可修改)
- 3.2+細(xì)胞器之間的分工合作課件高一上學(xué)期生物人教版(2019)必修1
- 水利電工程施工地質(zhì)規(guī)程
- JJF 2019-2022 液體恒溫試驗(yàn)設(shè)備溫度性能測試規(guī)范
- DZ∕T 0153-2014 物化探工程測量規(guī)范(正式版)
- (高清版)TDT 1013-2013 土地整治項(xiàng)目驗(yàn)收規(guī)程
- 國家開放大學(xué)電大《計算機(jī)應(yīng)用基礎(chǔ)(本) 》 終結(jié)性考試試題答案(完整版)
- 《建筑基坑降水工程技術(shù)規(guī)程》DBT29-229-2014
- 2023年廣東學(xué)業(yè)水平考試物理??贾R點(diǎn)
評論
0/150
提交評論