2008-11-14 18 views
0

讓我告訴你一些關於這個問題來自何處的信息。我一直在玩Serious Sam 2的SDK,這是一款運行於Serious Engine 2上的第一人稱射擊遊戲。該引擎引入了一些名爲MetaData的東西。元數據在引擎中用於序列化類並能夠在編輯器環境(嚴重編輯器2)中進行編輯。因此,例如,而不是:在dll中保存額外的數據,他們是如何做到的?

class CSomeGameItem : CEntity 
{ 
    public: 
    int iHealthToGive; 
} 

,不會在編輯器中顯示出來,你會怎麼做:

meta ver(1) class CSomeGameItem : CEntity _("Some game item") 
{ 
public: 
    meta int iHealthToGive; _("Amount of health to give") 
} 

現在製作水平的時候,你可以插入一個「一些遊戲項目」實體進入你的關卡,並編輯它的一個屬性。現在,我知道Croteam(所述遊戲和引擎的開發人員)正在使用額外的編譯器(Mdc,元數據編譯器)將關於類及其變量的額外信息注入到dll文件中,以使此元數據系統成爲可能。有沒有人有任何線索,他們如何做到這一點?

哦,順便說一句,meta,ver()和_()關鍵字在其代碼中被定義爲「無」,因此「正常」編譯器會忽略它們。

回答

0

這看起來有點類似於Qt的moc(元對象編譯器)。在Qt的情況下,它會生成額外的C++源文件,然後將其編譯並與原始源文件鏈接在一起。

在你的例子中的一個可能的實現是生成的文件實現一組函數,可以調用這些函數來獲取額外的信息,設置屬性等等。

1

如果這個引擎運行在Windows上,想到的一個想法是資源。有Windows API可以修改exe或dll資源的內容。此外,該API允許從「外部」exe/dll中讀取資源。這樣,額外的編譯器會將元數據作爲資源存儲在編譯好的exe文件中。開發工具包會從「base」exe/dll中讀取metad數據。

現在,我對那些東西感到厭煩,所以我可能距離它的實際工作時間很短。

1

爲了得到確鑿的答案,請研究PE File Format。這是Win32上的二進制文件的低級文件格式。即。 DLL,EXE,COM等

有許多書描述PE文件的佈局和功能。還有許多工具可以讓你探索它。

簡短的回答是,在最低級別,PE文件格式允許您將數據嵌入到可在運行時提取的二進制文件中。 DLL和Exe通常會嵌入其圖標和本地化文本。這些通常被稱爲資源。

一個很好的開始是MSDN上的Resource File部分。還研究「資源腳本(* .rc文件)」和「資源編譯器(rc.exe)」。

0

因爲我從來沒有看過sdk,所以只是在黑暗中刺探,但我猜測有兩個傳遞系統 - 一個是C++編譯器,另一個是自定義元數據處理器可以查找元標記並處理關聯的類名稱,實例成員名稱和_()標記。可能會創建某種配置文件,並將其留在一邊,或嵌入爲資源文件。自定義元數據傳遞也可以是一個C++代碼生成器,它會創建用於爲每個類啓用僞反射的代碼。

相關問題