Chinaunix首页 | 论坛 | 博客
  • 博客访问: 327161
  • 博文数量: 100
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 02:50
文章分类

全部博文(100)

文章存档

2011年(5)

2010年(12)

2009年(83)

分类:

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表中。

阅读(1626) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-04-13 11:06:53

不错 mangosd & realmd之间并不直连,而是靠数据库来交互,有点点纠结