|
发表于 2004-9-14 16:41:00
|
显示全部楼层
Re: Re:(服务器--是word文档--)
sorry,没时间整理,把以前写的一点东西贴上来好了
LoginGate模块
=============
只起到LoginSvr和Client之间的消息中介作用 <== 这种做法真的能起到加快响应速度吗?
1、将所有从客户端收到的消息直接转发给LoginSvr
2、将所有从LoginSvr收到的消息直接转发给客户端
SelGate模块
===========
结构简直跟LoginGate一模一样,只不过它连接到DBSvr上
LoginSvr模块
============
基本相当于AccountServer
实现的功能包括:
1、帐号密码验证
2、选择服务器
3、创建新帐号
GameGate模块
============
1、所有从客户端收到的消息都直接转发给GameSvr
2、所有从GameSvr收到的消息除了几个需要处理的GM_开头消息外,
GM_DATA消息直接压入相应UserInfo的发送缓冲区,在连接客户
端的完成端口模型工作线程中一起发送给客户端。
GameSvr模块
===========
主服务器模块。
需要连接到DBSvr和LoginSvr,接受GameGate的连接。
从代码上看,GameSvr的结构类似流水线作业方式,多线程分别处理流水线的几个步骤。
GameSvr内部流水线主要分以下几个部分:
1、ServerWorkerThread:GameGate消息接收处理
1) 处理GM_OPEN, GM_CLOSE, GM_CHECKCLIENT等消息
2) 把客户端消息分类后调用AddProcess加入PlayerObject的Operate处理队列
2、ProcessLogin:登录、退出处理
由于GameGate发送GM_OPEN消息到GameSvr, OpenNewUser的操作只是新建一个UserInfo插入等待表,
GM_CLOSE的CloseOpenedUser操作也只是将UserInfo加入等待表,并返回通知GameGate GM_CLOSE,
因此这里的循环只是检查等待表,根据UserInfo的状态做登录或者退出的操作
3、ProcessUserHuman:
1) 遍历UserInfoList,依次调用每个UserInfo的Operate来处理命令队列中的所有操作;
2) 遍历GateList,依次调用每个GateInfo的xSend函数将发送缓冲区中的消息发往GameGate;
4、ProcessMonster:
循环遍历所有MonsterObject,更新视线范围内目标,执行Operate;
如果是尸体,并且时间到,就删除;
5、ProcessNPC:
遍历所有的脚本,分别找到它们的目标对象CScripterObject,执行Operate(相当于AI系统了)
调用ProcessMerchants和ProcessEvents;
ProcessMerchants:
1) 初始化所有MerchantObject
2) 更新视线范围内目标,执行RunRace
ProcessEvents:
1) 顺序执行事件队列中的事件(火墙之类的都可以用这个实现)
更新NPC视线范围内的目标;
一、与LoginSvr的通讯
只保持连接,不做任何消息处理
估计只是为了让LoginSvr知道GameSvr是否活动
二、与DBSvr的通讯
1、连接建立以后,启动ProcessLogin, ProcessUserHuman, ProcessMonster, ProcessNPC等几个工作线程。
2、处理DBSvr发来的几个类型消息:
DBR_LOADHUMANRCD2,
DBR_LOADHUMANRCD,
DBR_MAKEITEMRCD,
DBR_MAKEITEMRCD2
三、与GameGate的通讯
GameGate于GameSvr相当于LoginGate之于LoginSvr
DBSvr模块
=========
1、创建完成端口模型socket, 处理从GameSvr发来的几个常用并且耗时间的数据库操作消息:
DB_LOADHUMANRCD
DB_SAVEHUMANRCD
DB_MAKEITEMRCD
DB_MAKEITEMRCD2
2、创建AsyncSelect模型socket, 处理SelGate发来的以下消息:
CM_QUERYCHR
CM_NEWCHR
CM_DELCHR
CM_SELCHR
|
|