如果你自己都不清楚所談論的東西,就根本不可能精确的描述它——馮諾依曼
今天我就試着來表述一件衆人皆知的事情,以測試自己到底有沒有明白這件事情。
ogre是著名的設計模式大師,這已是不争的事實。可以說ogre裡将設計模式用得淋漓盡緻。在這裡我就不批判設計模式該不該用了。反正ogre已經用了,并且沒有出現什麼不好的結果。适合的就是最好的,ogre證明了這一點。
随着ogre 1.7的釋出,大家熟悉的demo程式不見了,換來的是一個個的dll庫。而這些庫,就是作為ogre的一個插件而存在。拿skybox為例,(不要問為什麼拿skybox,如果真要知道,我隻能說,我剛好看上它了。)我們可以在skybox.cpp裡發現如下代碼。


dllstartplugin 和 dllstopplugin 是插件的加載和解除安裝接口。可以看到,當調用dllstartplugin 時,它先建立了一個sample_skybox執行個體,這就是我們真正的示例程式。緊接着,它又建立了一個插件。插件的名字則以執行個體的title資訊加上sample來标志。随後,這個示例程式的執行個體被加入插件中,然後調用root::getsingleton().installplugin(sp);函數初始化我們的插件。
顯然,我們需要看看installplugin幹了些什麼。


不難看出,ogre在這個函數中将插件加入了自己的插件容器中,并調用插件的初始化接口。以及輸出相關log資訊。
而又是在何時調用這個dllstartplugin來加載插件的呢。我們打開samplebrowser.h找到virtual sample* loadsamples()函數。在這個函數中的前幾句便反應了它所做的工作。


在這裡,例子浏覽器加載了samples.cfg檔案,并讀取相關内容。我們看看samples.cfg 裡裝了些什麼便一切明了了。


這些正好是我們的例子插件的dll檔案名。loadsamples函數在讀取了這些資訊後,将其放入 stringvector samplelist 中,然後依次周遊這個容器,并調用插件加載函數。代碼如下


按照我們分析問題的方案(我們總是從程式的行為進行跟蹤分析)。于是我們看看loadplugin函數做了些什麼。


由此,我們便可以知道整個程式的流程。。即例子浏覽器在初始化時讀取samples_d.cfg檔案,然後根據檔案内容加載所有的dll并初始化相關内容。
此時我們會考慮,如果我們想要新增一個例子,應該如何去做?于是,我們需要先看看sample_skybox 以及sampleplugin.
打開sample_skybox.h 我們便會看到


上面代碼說明了,sample_skybox繼承自sdksample,并且實作了setupcontent函數。
我們再打開sampleplugin可以看到有些空函數,說明在我們的例子中,sampleplugin并沒有做太多的初始化工作。于是,我們得到如下的關系
1、 sample_skybox派生自sdksample
2、 sampleplugin派生自plugin
3、 sampleplugin持有sample_skybox執行個體指針
4、 sampleplugin會注冊到root的插件管理中
5、 sample_skybox應該被加入到samples_d.cfg中。
于是,我們可以看到,如果我們想實作一個簡單的例子。則隻需要自sdksample派生一個實作類,并至少實作setupcontent函數。然後學着sample_skybox的樣子寫好dllstartplugin和dllstopplugin函數,并導出成dll,然後将dll名字添加到smaples_d.cfg中。
以上描述均是debug版本下。如果是release,則去掉後面的_d即可。
簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。
版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/geniusalex/archive/2010/07/15/1940475.html