天天看點

OGRE 1.7 例子程式分析

如果你自己都不清楚所談論的東西,就根本不可能精确的描述它——馮諾依曼

今天我就試着來表述一件衆人皆知的事情,以測試自己到底有沒有明白這件事情。

ogre是著名的設計模式大師,這已是不争的事實。可以說ogre裡将設計模式用得淋漓盡緻。在這裡我就不批判設計模式該不該用了。反正ogre已經用了,并且沒有出現什麼不好的結果。适合的就是最好的,ogre證明了這一點。

随着ogre  1.7的釋出,大家熟悉的demo程式不見了,換來的是一個個的dll庫。而這些庫,就是作為ogre的一個插件而存在。拿skybox為例,(不要問為什麼拿skybox,如果真要知道,我隻能說,我剛好看上它了。)我們可以在skybox.cpp裡發現如下代碼。

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

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

顯然,我們需要看看installplugin幹了些什麼。

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

不難看出,ogre在這個函數中将插件加入了自己的插件容器中,并調用插件的初始化接口。以及輸出相關log資訊。

而又是在何時調用這個dllstartplugin來加載插件的呢。我們打開samplebrowser.h找到virtual sample* loadsamples()函數。在這個函數中的前幾句便反應了它所做的工作。

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

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

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

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

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

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

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

由此,我們便可以知道整個程式的流程。。即例子浏覽器在初始化時讀取samples_d.cfg檔案,然後根據檔案内容加載所有的dll并初始化相關内容。

此時我們會考慮,如果我們想要新增一個例子,應該如何去做?于是,我們需要先看看sample_skybox 以及sampleplugin.

打開sample_skybox.h 我們便會看到

OGRE 1.7 例子程式分析
OGRE 1.7 例子程式分析

上面代碼說明了,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

繼續閱讀