Ogre中的 plugin 机制

         Ogre 把包括 RenderSystem, SceneManager, CgProgramManager, ParticleSystem 在内的很多东西都设计成了 Plugin ,其好处不言而喻。

        

         Plugin 中有 install(), uninstall(), initialize(), shutdown() getName() 五个纯虚函数。其中子类对象(或者负责实例化对象的 Factory )的创建是通过 install() 完成的,而大部分子类的 install() uninstall() 并没有做什么工作。

 

    Root 初始化系统时有 4 个函数和 Plugin 有关:

1.initialisePlugins(void) 2.installPlugin(Plugin* plugin) 3.loadPlugin(const String& pluginName) 4.loadPlugins(const String& pluginsFile)

 

 

 

    在 Root 构造函数的最后调用了函数 4 ,并逐一用配置文件中的每个 PluginName 调用函数 3

 

Ogre 中函数 3 如下:

 

void Root::loadPlugin(const String& pluginName) { // Load plugin library DynLib* lib = DynLibManager::getSingleton().load( pluginName ); // Store for later unload mPluginLibs.push_back(lib); // Call startup function DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol ("dllStartPlugin"); if (!pFunc) OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find symbol dllStartPlugin in library " + pluginName, "Root::loadPlugin"); // This must call installPlugin pFunc(); }

 

    其中通过 DynLibManager 将相应的动态库加载进来。之后以 D3D9Plugin 为例看看

pFunc() 的调用:

 

 

extern "C" void _OgreD3D9Export dllStartPlugin(void) throw() { plugin = new D3D9Plugin(); Root::getSingleton().installPlugin(plugin); //调用函数2 }   

  

    上面调用了函数 2 ,而 2 中又有:

 

plugin->install();

 

 至此,完成相应 Plugin 的构建工作.

  至于函数 1 ,是在:

Root->initialize()    

 

 中第一次窗口初始化之后进行的。

 

     同样,在最后有 4 个与上述函数功能相反的函数。

你可能感兴趣的:(exception,工作,String,function,dll,library)