插件(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 保存所有实例指针
————完————