Ogre源代码结构学习笔记——插件(Plugin)其它问题

插件(Plugin)结构的具体内容 我转载的文章里说的很系统清楚了。
《Ogre源代码浅析——插件(Plugin)工作原理》

待解决问题列表:

  1. 这样调用“dllStartPlugin”的函数
  2. DynLib类、plugin类和sample类的区别。
  3. 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 保存所有实例指针
    

————完————

猜你喜欢

转载自blog.csdn.net/jean7155/article/details/85593823
今日推荐