文档章节

MMO服务端设计-记录1-基础框架

梦想游戏人
 梦想游戏人
发布于 2017/07/25 11:41
字数 829
阅读 46
收藏 0
点赞 0
评论 0

https://git.oschina.net/dreamyouxi/MMOGame

1.网络库的选择

从原始的网络操作api写的话,会花费很多精力,选择一个成熟的网络库是一个很不错的方案。

可选择的底层网络库很多,asio libevent ace等。

对应 两种高性能I/O设计模式(Reactor/Proactor)

Proactor典型例子是:IOCP,asio

Reactor 典型例子是EPOLL,libevent

相比之下更倾向于asio的proactor模型,框架设计起来更简单,每次网络都是已经接收完成了,只需要对其逻辑处理即可。

但是服务器在linux下运行,asio 效率会折扣,期望是windows下开发,linux下运维,因此要压榨服务器的性能,跨平台的话一个网络库就不太可能限定起来。

无论是哪种方式,网络消息的分发都可以由一个中间件来完成,可以是master也可以是mgr,这样切换不同的网络库对于服务器本身逻辑的编写不会有什么改动,kbe是支持epoll select等 io机制,他的做法也是如此,网络事件都有一个distapcher统一分发该网络事件。

因此设计上就可以吧网络io层独立出来,代码看起来可能是这样

要切换到其他io 做一个适配层就可以了,

asio的适配

 

2.服务器并发模型

多进程单线程 or 多进程多线程 

关于并发基本模型主要有,多进程的单线程模型,多进程的多线程模型,单进程的多线程模型,这里的线程主要是指游戏逻辑执行的线程。多进程单线程模型,类似于kbe的架构,一个cell 或者base 游戏逻辑执行的线程只有一个,这样大大简化了代码开发难度,效率相对也较高,比如吧一个cell做场景服务器,多个cell协同合作,玩家跨场景就在cell之间切换。

数据迁移的速度就很关键了,这也是实现无缝跨地图的重要因素,。kbe的这种bigworld方式的数据迁移主要就用socket 共享内存 redis 等,但是这些速度都没那么快,能用内存就用内存。

根据上述缺陷,还有一种解决方案,就是把cell base 直接装进一个进程里,数据迁移就简单得多,加个锁 然后更改数据指针所有权即可。这样吧cell当做线程来处理,cellMgr 可以当做这个进程的主线程,负责维护处理cell,这样吧进程通信socket 更改为了直接的内存交互,

这样做的一个缺点是把这些cell cellmgr 限制在了一台物理机上,由于都在同一个物理机,从单台物理机限制了并发量,一个cell 宕机之后 如果处理不得当,会导致整个进程宕机,从而影响整个系统,再者局域网通信socket 都可以维持在1ms以内。 这点数据迁移代价节约的并不多,如果客户端也要loading的话,那还不如不做这种优化,PS:反正都要读条

 

TODO

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 34
博文 402
码字总数 115594
作品 0
成都
游戏服务端究竟解决了什么问题?

1.写在前面 既然是游戏服务端程序员,那博客里至少还是得有一篇跟游戏服务端有关的文章,今天文章主题就关于游戏服务端。写这篇博客之前也挺纠结的,一方面是因为游戏服务端其实不论架构上还...

Yomut ⋅ 2016/07/01 ⋅ 0

网易游戏服务器开发框架--Pomelo

pomelo 是由网易开发的基于node.js开发的高性能、分布式游戏服务器框架, 也可作为高实时web应用框架。 Pomelo的应用范围 pomelo最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端,开...

谢骋超 ⋅ 2012/10/23 ⋅ 10

BossHX/xingo_demo

xingo_demo xingo mmo大型多人在线游戏 带unity3d 客户端的服务器端demo xingo框架需要切换到no reflect 分支 git checkout noreflectveriosn 该demo实现了mmo游戏的基础模块aoi(基于兴趣范围...

BossHX ⋅ 2016/12/21 ⋅ 0

和某游戏猎头的对话

HI。 游戏猎头徐磊 16:00:34 请教你一个问题。。现在方便不? 午后の咖啡 16:00:45 在 游戏猎头徐磊 16:01:07 研发 高级软件工程师 项目描述:3D模拟经营网络游戏人生OL 开发工具:VS2005, F...

付翔 ⋅ 2010/04/07 ⋅ 0

Twitter zipkin 分布式跟踪系统的设计与实现

概述 Twitter的zipkin是一个致力于收集Twitter所有的分布式服务的时间数据的分布式跟踪系统。它提供了收集数据,和查询数据两大服务。系统的理论模型来自于Google Dapper 论文。Dapper这篇论...

tqyin ⋅ 2016/09/28 ⋅ 2

Socket开发框架之框架设计及分析

虽然在APP应用、Web应用、Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利、压力监测方面...

walb呀 ⋅ 2017/12/04 ⋅ 0

【分享】微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件组...

typhoon55 ⋅ 2017/08/23 ⋅ 3

【推荐】SPRINGMVC+MYBATIS+SHIRO+DUBBO+ZOOKEEPER+REDIS微服务大型分布式企业框架

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件组...

qq59410a0b9a625 ⋅ 2017/06/20 ⋅ 0

【推荐】微服务大型分布式企业框架 dubbo + springmvc + mybatis + ehcache + redis分布式架构

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件组...

旅行途中 ⋅ 2017/06/14 ⋅ 8

[教程] Android PHP 最佳实践视频教程

这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程《Android+PHP最佳实践》已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系列视频教程...

长平狐 ⋅ 2012/11/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 36分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部