Mir2ei的C++源码呈现经典的多进程分离式架构,核心模块划分为LoginSvr、GameSvr、DBSvr三个独立进程。各进程之间通过TCPSocket通信,这种隔离设计保证单个进程崩溃不会直接影响其他服务。源码目录结构清晰反映功能边界:LoginSvr负责账号验证与角色列表查询,GameSvr承载所有游戏内逻辑处理,DBSvr作为GameSvr与底层数据库之间的桥梁。
启动顺序遵循严格的依赖链条。DBSvr最先启动负责数据库连接初始化,LoginSvr次之处理登录请求,GameSvr作为数据引擎随后启动,最后依次启动GameGate、SelGate和LoginGate三个网关。网关层的设计目的在于隔离外部流量,客户端数据经过网关转发至游戏引擎处理,GameSvr本身不直接暴露在公网环境。
网络通信模型基于IOCP完成端口实现异步收发。服务端启动时执行CheckAvailableIOCP检测操作系统是否支持IOCP,InitInstance完成WSAStartup网络库加载。AcceptThread线程在监听套接字上执行accept操作,客户端连接成功后生成CSessionInfo对象记录会话信息。新套接字通过CreateIoCompletionPort关联完成端口,随后投递异步WSARecv调用接收客户端消息。WSASend与WSARecv作为异步函数立即返回,实际收发操作由Windows内核线程池完成,完成后将完成事件推送至端口队列,GetQueuedCompletionStatus在工作线程中阻塞等待并取出结果。
LoginGate与LoginSvr之间的通信通过消息队列与心跳机制维持。ThreadFuncForMsg线程持续检测g_xMsgQueue队列中的数据包,通过IOCP投递WSASend发送到LoginSvr。OnTimerProc定时调用SendExToServer发送PACKET_KEEPALIVE心跳包维持连接状态。连接断开时设置_ID_TIMER_CONNECTSERVER定时器触发重连操作。LoginSvr处理LoginGate转发的客户端消息,将验证结果返回后由LoginGate转发回客户端。
客户端源码由WindHorn和Mir2Ex两个工程构成。CWHApp派生CWHWindow,CWHWindow再派生CWHDXGraphicWindow完成窗口创建与DirectX初始化。CWHDefProcess派生出CLoginProcess、CCharacterProcess、CGameProcess三个类,分别对应登录、角色选择、游戏逻辑三个处理状态。程序运行时g_bProcState变量标记当前状态,消息循环根据该标志选择调用对应Process的RenderScene函数渲染画面。网络消息与窗口消息通过虚函数分派到不同状态的子类方法处理。
GameSvr承载游戏主逻辑,地图管理、怪物AI、玩家行为处理、战斗计算、物品技能系统全部在此模块实现。客户端与GameSvr的协议通信基于TDefaultMessage结构定义,包含wIdent消息编号、wParam和wParam2参数位、dwUser和dwUser2用户数据字段。不同wIdent值对应不同业务逻辑分支,SM_NEWMAP触发地图加载,SM_LOGON处理登录成功响应,SM_ABILITY接收玩家属性数据,SM_BAGITEMS接收背包物品清单。收到的消息包按wIdent路由至对应的处理函数段执行逻辑操作。
启动顺序遵循严格的依赖链条。DBSvr最先启动负责数据库连接初始化,LoginSvr次之处理登录请求,GameSvr作为数据引擎随后启动,最后依次启动GameGate、SelGate和LoginGate三个网关。网关层的设计目的在于隔离外部流量,客户端数据经过网关转发至游戏引擎处理,GameSvr本身不直接暴露在公网环境。
网络通信模型基于IOCP完成端口实现异步收发。服务端启动时执行CheckAvailableIOCP检测操作系统是否支持IOCP,InitInstance完成WSAStartup网络库加载。AcceptThread线程在监听套接字上执行accept操作,客户端连接成功后生成CSessionInfo对象记录会话信息。新套接字通过CreateIoCompletionPort关联完成端口,随后投递异步WSARecv调用接收客户端消息。WSASend与WSARecv作为异步函数立即返回,实际收发操作由Windows内核线程池完成,完成后将完成事件推送至端口队列,GetQueuedCompletionStatus在工作线程中阻塞等待并取出结果。
LoginGate与LoginSvr之间的通信通过消息队列与心跳机制维持。ThreadFuncForMsg线程持续检测g_xMsgQueue队列中的数据包,通过IOCP投递WSASend发送到LoginSvr。OnTimerProc定时调用SendExToServer发送PACKET_KEEPALIVE心跳包维持连接状态。连接断开时设置_ID_TIMER_CONNECTSERVER定时器触发重连操作。LoginSvr处理LoginGate转发的客户端消息,将验证结果返回后由LoginGate转发回客户端。
客户端源码由WindHorn和Mir2Ex两个工程构成。CWHApp派生CWHWindow,CWHWindow再派生CWHDXGraphicWindow完成窗口创建与DirectX初始化。CWHDefProcess派生出CLoginProcess、CCharacterProcess、CGameProcess三个类,分别对应登录、角色选择、游戏逻辑三个处理状态。程序运行时g_bProcState变量标记当前状态,消息循环根据该标志选择调用对应Process的RenderScene函数渲染画面。网络消息与窗口消息通过虚函数分派到不同状态的子类方法处理。
GameSvr承载游戏主逻辑,地图管理、怪物AI、玩家行为处理、战斗计算、物品技能系统全部在此模块实现。客户端与GameSvr的协议通信基于TDefaultMessage结构定义,包含wIdent消息编号、wParam和wParam2参数位、dwUser和dwUser2用户数据字段。不同wIdent值对应不同业务逻辑分支,SM_NEWMAP触发地图加载,SM_LOGON处理登录成功响应,SM_ABILITY接收玩家属性数据,SM_BAGITEMS接收背包物品清单。收到的消息包按wIdent路由至对应的处理函数段执行逻辑操作。

