分类:
2009-12-21 17:59:24
mangosd 之 framework
总结了一下mangosd中的线程及其完成的大体工作,对mangos理解不深,可能不全,或者理解有误,欢迎指正。
(1) main thread
mangosd初始进入的启动线程,即Master::Run(),这个现场会进行mangosd各种初始化操作,连接数据库,读取配置,初始化游戏世界,启动CliRunnable和WorldRunnable线程,启动对RASocket(远程管理接口)和WorldSocket的监听操作。做完了必要的初始化以后,在其主循环中监听并处理来自RASocket和WorldSocket的数据。
对于来自RASocket的数据,main thread需要将其从网络中读出来(通过注册到WorldSocketMgr中的OnRead实现),并进行解析和校验,最后将命令封装成Command,通过CliCommandHolder包裹后送到world的cliCmdQueue队列中,然后world在其周期性的update中会调用ProcessCliCommands统一处理这个队列中的命令。在ProcessClientCommands中会循环取出所有命令,world在这里的处理方式很简单,只需要取出command调用其Execute接口就可以了,因为每个command对于的处理接口早就设置好了。
对于来自WorldSocket的数据(各个用户自己的数据),main thread任然需要将数据接收进来,如有必要还需进行消息头解析和解密操作;如果是ping和auth消息,将直接处理掉;否则将会送到该链接对应的玩家的WorldSession队列中(每个玩家都对应一个唯一的WorldSession),然后WorldSession在其Update中会检查接收队列中的消息包。WorldSession的Update是在World调用Update的时候触发的。
(2) CliRunnable thread
在main thread中启动的,用于从stdin读入用户的控制命令;解析后任然通过cliCmdQueue发到world中,由world统一处理;其作用和RASocket一样,只是一个读取本地用户命令;一个读取远程用户命令;
(3) WorldRunnable thread
游戏世界的更新线程,主要是检测相关定时器,然后做相应的超时处理;处理来自cliCmdQueue的用户命令;更新每个玩家的WorldSession;
(4) SqlDelayThread
对每一个数据库的访问都有一个DelayThread来进行,所以有三个DelayThread线程(WorldDatabase(对应mangos),CharacterDatabase(对应character),LoginDatabase(对应realmd))。在main thread的StartDB中启动。
(5) ResolvServer thread
异步域名解析的线程,接收域名解析请求,返回结果。什么情况下会用到这个东西?
(6) mangosd & realmd
mangosd主要是负责游戏世界的处理,而realmd是负责用户登陆,补丁下载的工作。玩家首先会登陆到realmd做验证,成功之后realmd会把当前可用的mangosd服务器列表(来自realmd数据库中的realmlist表)发给客户端。mangosd启动成功后会将自己的信息写入到realmlist表中。