开源服务器框架NoahFrame分享 第二章:插件与模块

2017-10-31

最初接触插件(Plugin)是当年开发客户端的时候使用的Ogre引擎,里面的设计另当时我这个小菜鸟惊叹不己,原来还可以这样组织代码。然后时隔多年,在Ogre的影响下,又进一步在NF引擎内加入了module和component,用以完善插件式遗漏的一些缺陷。

Ogre的插件式架构,是建立在动态库上的,windows为.dll,linux为.so,NF引擎也是如此(我在主导无双项目在开发的时候,又全部改成了静态库,改成静态库在NF引擎中只需要修改几十行代码即可)。使用插件来组织代码,好处非常多,比如同事分工协作方面,比如逻辑热更新方面(静态语言非脚本,比如使用c 热更新),比如维持代码的单纯度和统一管理规范方面,比如企业安全信息保密方面等等。

NF引擎的插件管理比Ogre略复杂,主要体现在每个插件内部都有module,然后所有的module在启动时又都注册到PluginManager接受PluginManager的管理。NFPluginLoader为程序的执行入口,他会自动查找启动目录下的Plugin.xml文件,然后加载里面配置过的plugin(或者自行传入名字让PluginLoader加载),例如:

Plugin.xml内部声明了每类服务器启动的时候需要加载的插件以及配置文件(NFDataCfg)路径,因为考虑到产品运维更偏向使用脚本批量启动服务器,因此AppID在脚本中可以传入,比如:

./NFPluginLoader_d -d Server=MasterServer ID=3

./NFPluginLoader_d -d PluginX.xml Server=MasterServer ID=3

插件加载程序的入口在文件NFPluginLoader.cpp的main函数,会先初始化NFCPluginManager,

然后调用NFCPluginManager进行初始化加载动态库(.dll .so),然后统一管理所有的插件,并统一进行初始化,反初始化,帧执行等操作,简略代码如下:

int main(int argc, char* argv[])

{

ProcessParameter(argc, argv);

NFCPluginManager::GetSingletonPtr()->Awake();

NFCPluginManager::GetSingletonPtr()->Init();

NFCPluginManager::GetSingletonPtr()->AfterInit();

123456阅读全文

相关游戏

最新合集

相关文章

网友评论

    加载更多
    回复 [1楼 ]取消回复