天天看点

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

继续阅读