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源码分析相关推荐
- Mangos源码分析(15):游戏对象的实现
狭义的游戏对象是指游戏世界中所能看到及可交互的对象,如玩家.怪物.物品等,我们这里也主要讨论这类对象在服务器上的组织及实现. 在大部分的MMOG中,游戏对象的类型都大同小异,主要有物品.生物.玩家等. ...
- Mangos源码分析(3):服务器结构探讨之简单的世界服实现
讨论了这么久我们一直都还没有进入游戏世界服务器内部,现在就让我们来窥探一下里面的结构吧. 对于现在大多数MMORPG来说,游戏服务器要处理的基本逻辑有移动.聊天.技能.物品.任务和生物等,另外还有地图 ...
- Mangos源码分析(2):服务器结构探讨之登录服的负载均衡
回想一下我们在玩wow时的操作流程:运行wow.exe进入游戏后,首先就会要求我们输入用户名和密码进行验证,验证成功后才会出来游戏世界列表,之后是排队进入游戏世界,开始游戏... 可以看到跟前面的描述 ...
- Mangos源码分析(4):服务器结构探讨之继续世界服
都已经看出来了,这种每切换一次地图就要重新连接服务器的方式实在是不够优雅,而且在实际游戏运营中也发现,地图切换导致的卡号,复制装备等问题非常多,这里完全就是一个事故多发地段,如何避免这种频繁的连接操作 ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
最新文章
- CSS选择器学习小结
- 软件的可维护性与可复用性(一)(Java与模式笔记)
- 【控制】滑动模型控制(Sliding Mode Control)
- 去掉文化管理系统广告
- 敏捷的项目启动-尽早启动!
- eclipse项目红叉,Target runtime Apache Tomcat 6.0 is not defined
- shell中字分隔的妙用:变量IFS
- 幻影机器人庄园参观路线_市委老干部局机关党员干部一行赴机器人小镇参观考察...
- scala(10)-----Scala 闭包
- Flink学习笔记:搭建Flink on Yarn环境并运行Flink应用
- TypeScript 官方决定全面采用 ESLint
- 银行使用计算机实现个人存款,电脑基础 第2章 真题整理1.doc
- C++基础知识(一) 键盘输入
- 剑指Offer——完美+今日头条笔试题+知识点总结
- vgp虚拟路面_吉水县道路运输展示价格实惠
- VMware虚拟网络编辑器用法
- github项目管理和贡献代码
- DuerOS智能设备激活数破亿!百度补贴上亿造节再添一把火
- Hash哈希查找算法
- 软件项目管理Follow Me--如何进行项目估算