main
看起来似乎所有的组件都有一个这样的宏(KBENGINE_MAIN)来包裹main函数1
2
3
4
5
6intKBENGINE_MAIN(intargc, char* argv[])
{
ENGINE_COMPONENT_INFO&info = g_kbeSrvConfig.getXXX();
returnkbeMainT<XXX>(argc, argv, YYY, info.externalPorts_min,
info.externalPorts_max, info.externalInterface, 0, info.internalInterface);
}
这个宏展开是这样子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15kbeMain(intargc, char* argv[]); \
intmain(intargc, char* argv[]) \
{ \
loadConfig(); \
g_componentID = genUUID64(); \
parseMainCommandArgs(argc, argv); \
char dumpname[MAX_BUF] = {0}; \
kbe_snprintf(dumpname, MAX_BUF, "%"PRAppID, g_componentID); \
KBEngine::exception::installCrashHandler(1, dumpname); \
intretcode = -1; \
THREAD_TRY_EXECUTION; \
retcode = kbeMain(argc, argv); \
THREAD_HANDLE_CRASH; \
returnretcode; \
} \
稍微整理一下之后main函数看起来很像是这个样子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20intkbeMain(intargc, char* argv[]);
intmain(intargc, char* argv[])
{
loadConfig();
g_componentID = genUUID64();
parseMainCommandArgs(argc, argv);
chardumpname[MAX_BUF] = {0};
kbe_snprintf(dumpname, MAX_BUF, "%"PRAppID, g_componentID);
KBEngine::exception::installCrashHandler(1, dumpname);
intretcode = -1;
THREAD_TRY_EXECUTION;
retcode = kbeMain(argc, argv);
THREAD_HANDLE_CRASH;
return (retcode);
}
intkbeMain(intargc, char* argv[])
{
ENGINE_COMPONENT_INFO&info = g_kbeSrvConfig.getXXX();
return kbeMainT<XXX>(argc, argv, YYY, info.externalPorts_min, info.externalPorts_max, info.externalInterface, 0, info.internalInterface);
}
基本可以理解为每个组件的main函数流程都是一样的,只是在特化kbeMainT时所给参数不一样。
ServerConfig:
ServerConfig涉及到服务端每个组件的各种配置选项,比如数据库访问。它的构造在组件名.cpp中,比如loginapp就在loginapp.cpp,machine就在machine.cpp中,loginapp的如下(server/loginapp/loginapp.cpp):1
2ServerConfigg_serverConfig;
KBE_SINGLETON_INIT(Loginapp);
它的初始化(配置)工作主要由loadConfig接口完成,如下(lib/server/kbemain.h):1
2
3
4
5
6
7
8
9
10inlinevoidloadConfig()
{
Resmgr::getSingleton().initialize();
// "../../res/server/kbengine_defs.xml"
g_kbeSrvConfig.loadConfig("server/kbengine_defs.xml");
// "../../../assets/res/server/kbengine.xml"
g_kbeSrvConfig.loadConfig("server/kbengine.xml");
}
Resmgr:
Resmgr负责管理kbe的所有资源管理,比如资源路径,环境变量。Resmgr的构造地方如下(lib/network/fixed_messages.cpp):1
2
3
4
5
6
7FixedMessages::FixedMessages():
_infomap(),
_loaded(false)
{
newResmgr();
Resmgr::getSingleton().initialize();
}
我们可以理解为FixedMessages构造的时候Resmgr就构造了。
Resmgr的初始化(配置)工作主要由initialize接口完成,代码如上。