Ogre原始碼結構學習筆記——外掛(Plugin)其它問題
外掛(Plugin)結構的具體內容 我轉載的文章裡說的很系統清楚了。
《Ogre原始碼淺析——外掛(Plugin)工作原理》
待解決問題列表:
- 這樣呼叫“dllStartPlugin”的函式
- DynLib類、plugin類和sample類的區別。
- DynLib類、plugin類和sample類直接的呼叫具體流程。
針對以上問題整理記錄的學習筆記。(這裡是jean7155的部落格 在 csdn)
這三個類的關係是
DynLib類 > plugin類 > sample類
即:每個 DynLib類裡可以包含多個plugin類,每個plugin類可以包含多個sample類。
從小向大逐層分析。
(1)sample類
sample類的規範框架包括 例項的啟動/結束,例項資源的載入/解除安裝,滑鼠鍵盤注入,渲染重新整理的響應,場景建立,視窗重繪。
(2)plugin類
Ogre::Plugin類 相當於一個介面,定義了幾個純虛擬函式(getName、install、initialise、shutdown、uninstall)。
SampleBrowser專案中的SamplePlugin類繼承了Ogre::Plugin類。SamplePlugin類功能如下:
//實現父類Ogre::Plugin類中的純虛擬函式。這裡實現的都是空函式。 //管理SampleSet mSamples;(裡面儲存多個Sample)。 //實現了Ogre::String mName;
如上,執行例項SamplePlugin類中儲存並管理類一個Sample物件集。所以每個SamplePlugin類可以包含多個sample類。
所以,sample和plugin不對等,sample儲存在SampleBrowser類的
SampleSet mLoadedSamples; // loaded samples 儲存所有例項指標
(3)DynLib類
//這個類用 巨集定義 適配了不同平臺上面的dll或者dylib等檔案的操作。 //操作包括載入、解除安裝、獲得函式指標(load、unload、getSymbol)。 //獲得函式指標(getSymbol)可以獲得dll中定義的函式,呼叫dllStartPlugin函式和dllStopPlugin函式。
在類中可以定義多個類,可以是plugin,也可以是別的任意的類。在dllStartPlugin函式中對這個類進行new初始化後,將它指標和plugin類相關聯,通過plugin類註冊到Ogre核心中,就可以在以後的呼叫了。
(4)呼叫流程
載入配置檔案cfg,解析待載入的檔案路徑和檔名。(這裡以後學)
- 1、呼叫 **Root::loadPlugin(pluginName)**函式載入。
-
1.1、通過DynLibManager類載入管理DynLib類。載入dll或dynLib等檔案。儲存到 mPluginLibs中。
DynLib* lib = DynLibManager::getSingleton().load( pluginName );
-
1.2、呼叫dllStartPlugin函式。通過DynLib類獲得函式指標(getSymbol),可以獲得dll中定義的函式呼叫dllStartPlugin函式和dllStopPlugin函式。
/* new 一個Sample類的子類,記作sampleInstance。 new 一個SamplePlugin類,將sampleInstance新增到SamplePlugin物件中。 將SamplePlugin物件註冊到Ogre核心中。註冊的時候會儲存mPlugins中用於管理。 下面是一個骨骼動畫的程式碼作為例子。 */ extern "C" _OgreSampleExport void dllStartPlugin() { s = new Sample_Character; sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample"); sp->addSample(s); Root::getSingleton().installPlugin(sp); }
-
RenderSystem_GL專案中例項如下:
extern "C" void _OgreGLExport dllStartPlugin(void) throw() { plugin = new GLPlugin(); Root::getSingleton().installPlugin(plugin); }
-
2、獲得Ogre::Plugin* ,強制型別轉換成 SamplePlugin*,通過SamplePlugin* 獲得SampleSet。
SampleSet newSamples = sp->getSamples();
-
3、遍歷SampleSet,載入所有sample,並將載入好的例項儲存到SampleBrowser類的
SampleSet mLoadedSamples; // loaded samples 儲存所有例項指標
————完————