mangos 的执行模型 
一、线程分布: 
1、主线程 main---- Master::Run() ,主要功能:初始化world、创建子线程、回收资源 
2、WorldRunnable -------GS主线程 
3、CliRunnable -----后台调试线程 
4、RARunnable -------事件处理和分发线程 
5、MaNGOSsoapRunnable---协议 
6、FreezeDetectorRunnable 
7、线程池 Master::Run----WorldSocketMgr::StartNetwork---WorldSocketMgr::StartReactiveIO ---ReactorRunnable

二、事件分发和处理 
WorldRunnable::run---World:update----World:UpdateSessions---WorldSession::Update(一个socket内所有事件)---各种各样的handler

基本框架:ACE的Reactor机制(ACE_TP_Reactor)

三、WorldRunnable 主要功能 
WorldRunnable ----World 定时器任务+网络事件(session中的)+异步IO回调+任务系统调度+cli

整个game server的并发模型

一 概述 
game server至少要提供如下几类的功能 : 
1、响应客户端请求-------WorldRunnable 
2、后台命令 -------CliRunnable 
3、分布式架构(RMI等) -------MaNGOSsoapRunnable

可以看到针对这几类功能,mangos都给予了支持。

二、WorldRunnable响应客户端请求的并发实现 
game server会提供很多服务,如组队、加好友、交易、走路、战斗……,从宏观上讲这些服务是同时对外提供的,另外IO操作是费时的, 
必须将IO与逻辑处理分开,这样的话一个基本的实现是这样的: 
1、开启IO线程,所有费时的操作交由此处处理 WorldDatabase.ThreadStart(); 
2、利用协程来实现各个子系统,或者利用心跳来实现各个子系统的调度(不能开很多线程,线程代价太高)

三、Mangos的心跳实现 
void World::Update(uint32 diff) 
基本上包括几类: 
1、检查定时器---------------时间 
2、刷任务 
3、维护session---------------------人物 
4、全局环境更新(map、battleGround)--------地点 
5、处理服务器事件------------------事件 
6、其他(数据同步、后台调试、IO回调……)

四、game server运行的机制 
1、定时器触发 
2、事件触发(松耦合)

五、典型的一种service的实现方式 
1、IO协程将cammand入队 
2、worker协程 依次fetch、execute 
核心数据结构是线程安全的队列

GS生命期内主要的事件---------状态机的状态转换主要是基于事件

一 game server状态机 
startup 
LOAD 
Compile 
init 
running 
shutdown

二 角色状态机 
login 
enter_world 
enter_map 
leave_map 
leave_world 
relogin 
logout

三 角色commands的命令种类 
login、auction, buy, chat, express, move, task, select_menu_item, stall……

四 server端service的组织 
1、结构化(纯c实现) clone, feature、cmds(命令入口filter)、daemons(抽象的功能模块) 
2、OO 各个层次的router,XXHandler, 一般在session中的总入口是player

session管理

一、world核心数据结构:环境+session 
SessionMap m_sessions; 
Queue m_QueuedSessions; 
typedef UNORDERED_MAP<uint32, Weather*> WeatherMap; 
WeatherMap m_weathers;

二、WorldSession 核心数据结构 玩家+信道+消息队列 
Player *_player; 
WorldSocket *m_Socket; 
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; // 每个session有一个消息队列

整个session就是不停的fetch,处理msg的过程 
OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()]; // 利用一次映射找到handler 
handle_input_payload----int WorldSocket::ProcessIncoming (WorldPacket* new_pct)--------void WorldSession::QueuePacket(WorldPacket* new_packet)

三、player核心数据结构 map、权限、社会关系、管理员?拍卖?谈话 存储 包裹 物品……

概述:所有command缓存在socket的队列中,各个子系统的总入口是player

服务端每一帧的逻辑: 
1、从OS处取出到达的事件到本进程(所有的事件已经缓存在socket队列中) 
2、依次调度各个子系统或子子系统

对于node.js而言,线程调度、事件缓存、回调机制已经都实现了,程序员只要实现具体的逻辑和定时器(子系统)就可以了

game server内嵌的http服务

如何使gs响应http的请求? 基本思路 实现简单的http server框架、具体游戏逻辑转发给内部handler来处理

一 初始化 
开启监听线程(协程)检查端口、设置缓冲区大小 
每一个socket连过来时 1、开新协程处理(有调度开销) 2、放入共享队列中,由worker线程池共同维护(有数据同步的问题) 
设置每个请求URI对应的回调接口

二 服务期 
1、一个socket数据到来后,开新线程,解析http数据,分析出请求的uri、回调、关闭socket、关闭线程(因为http是无连接的) 
2、一个socket到来时,其被放入某个thread内部的sockets数组中, 
当此worker thread池被调度到之后,依次处理每个socket的数据就可以了(唯一区别是多个sockets由几个线程维护)

mangos源码分析相关推荐

  1. Mangos源码分析(15):游戏对象的实现

    狭义的游戏对象是指游戏世界中所能看到及可交互的对象,如玩家.怪物.物品等,我们这里也主要讨论这类对象在服务器上的组织及实现. 在大部分的MMOG中,游戏对象的类型都大同小异,主要有物品.生物.玩家等. ...

  2. Mangos源码分析(3):服务器结构探讨之简单的世界服实现

    讨论了这么久我们一直都还没有进入游戏世界服务器内部,现在就让我们来窥探一下里面的结构吧. 对于现在大多数MMORPG来说,游戏服务器要处理的基本逻辑有移动.聊天.技能.物品.任务和生物等,另外还有地图 ...

  3. Mangos源码分析(2):服务器结构探讨之登录服的负载均衡

    回想一下我们在玩wow时的操作流程:运行wow.exe进入游戏后,首先就会要求我们输入用户名和密码进行验证,验证成功后才会出来游戏世界列表,之后是排队进入游戏世界,开始游戏... 可以看到跟前面的描述 ...

  4. Mangos源码分析(4):服务器结构探讨之继续世界服

    都已经看出来了,这种每切换一次地图就要重新连接服务器的方式实在是不够优雅,而且在实际游戏运营中也发现,地图切换导致的卡号,复制装备等问题非常多,这里完全就是一个事故多发地段,如何避免这种频繁的连接操作 ...

  5. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  6. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  7. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  8. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  9. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

最新文章

  1. CSS选择器学习小结
  2. 软件的可维护性与可复用性(一)(Java与模式笔记)
  3. 【控制】滑动模型控制(Sliding Mode Control)
  4. 去掉文化管理系统广告
  5. 敏捷的项目启动-尽早启动!
  6. eclipse项目红叉,Target runtime Apache Tomcat 6.0 is not defined
  7. shell中字分隔的妙用:变量IFS
  8. 幻影机器人庄园参观路线_市委老干部局机关党员干部一行赴机器人小镇参观考察...
  9. scala(10)-----Scala 闭包
  10. Flink学习笔记:搭建Flink on Yarn环境并运行Flink应用
  11. TypeScript 官方决定全面采用 ESLint
  12. 银行使用计算机实现个人存款,电脑基础 第2章 真题整理1.doc
  13. C++基础知识(一) 键盘输入
  14. 剑指Offer——完美+今日头条笔试题+知识点总结
  15. vgp虚拟路面_吉水县道路运输展示价格实惠
  16. VMware虚拟网络编辑器用法
  17. github项目管理和贡献代码
  18. DuerOS智能设备激活数破亿!百度补贴上亿造节再添一把火
  19. Hash哈希查找算法
  20. 软件项目管理Follow Me--如何进行项目估算

热门文章

  1. Linux对组的操作(创建/删除/添加成员...)
  2. FIFO深度计算问题
  3. 微软面试100题2010年版全部答案集锦 含下载地址
  4. Java中获取Exception的详细信息
  5. 商业周刊:IBM专注Power芯片 一统天下? 【ZZ】
  6. ftps证书过期解决办法
  7. 2D动画如何做出3D体积感
  8. 免费代理平台的搭建和隧道代理的使用
  9. mxGraph浅入 之 Tooltip
  10. 网络安全你必须知道的100个小知识