大型网络游戏服务器的框架设计
服务器是用来处理高并发的请求,同时能够满足扩展的业务逻辑的需求,最重要的是满足三点:并发性,稳定性,扩展性。
经历过两款上线游戏产品,见识到了游戏行业的杂乱无章,虽然和传统软件行业相比,少了那么些规范,但是对个人能力要求还真不比传统软件行业低。
今天开始,陆续利用业余时间将自己设计的一个服务器的框架贴出来,也会包好一些基本的代码,也会用到一些开源库。从最基础的讲起,首先看看一个实时网络游戏服务器的框架:
目前市面上的游戏,总的来说分为两类:
1.弱联网类游戏,像手机上的卡牌类游戏(MT,Dota传奇等),大部分逻辑在客户端处理,不需要实时联网,这类游戏只有一个玩家,而且只有PVE模式,就是打游戏中的机器人(AI),不存在玩家与玩家的实时交互。例如一场副本打斗,只有在开始和结束,才会连接服务器,请求获取或者存储数据,打斗过程由客户端计算完成,最后将战斗结果提交服务器就行了。
2.强联网类游戏,典型的就是MMORPG或者MMARPG的类型的游戏,一般常见于端游或者页游,也包含手游。在一个地图中,同时有很多玩家,任何一个玩家的状态或者属性发生变化,服务器就需要实时更新游戏中角色的状态,并且通知到周围的玩家。例如在副本中,一个玩家释放技能,攻击范围,伤害计算这些逻辑都是服务器来完成的,而客户端只需要负责特效的显示,这个过程中需要实时的数据交互。
显然,第2种,MMORPG类游戏需要服务器做更多的事情,对服务器的运算要求更高,实时性要求更高,自然实现起来更复杂。
一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块。
这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装。
对于服务器的并发性,要么采用单进程多线程,要么采用多进程单线程的方式,说说两种方式的优缺点:
一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程:
网络通讯层,业务逻辑,数据存储,分别在独立的线程中,无守护进程。
优点:
1.数据共享和交换方便,使用全局变量或者单例就可以,数据存储方便。
2.单进程,服务器框架结构相对简单,编码容易。
缺点:
1.所有功能只能在单个物理服务器上,不能做成分布式。
2.不方便监控各个线程状态,容易死锁
3.一个线程出错,例如内存非法访问,栈空间被破坏,那么服务器进程就退出,所有玩家掉线,影响大。
二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程:
网路通讯,业务逻辑,数据存储,守护进程,分别在不同的进程。
优点:
1.各个进程可以分布在不同的物理服务器上,可以做成分布式的服务器框架,例如可以将数据存储单独放到一个物理服务器上,供几个区的服务器使用。将网络通讯进程独立出来,甚至可以做成导向服务器,实现跨服战。
2.可以通过守护进程监控其它进程状态,例如有进程死掉,马上重启该进程,或者某个进程cpu使用率接近100%(基本可以判断是某个逻辑死循环了), 强制kill掉该进程,然后重启。
3.单个服务器进程异常退出,只要不是网络通讯进程(一般这个都会比较稳定,没什么逻辑),那么就可以及时被守护进程重启,不会造成玩家掉线,只会造成在1-2秒内,某个逻辑功能无法使用,甚至玩家都感觉不到。
4.服务器通过共享内存进行数据交换,那么如果其中一个服务器死掉,数据还在,可以保护用户数据(当然多线程也可以使用共享内存)。
5.并发性相对多线程要高点。
缺点:
1.不方便使用互斥锁,因为进程切换的时间片远远于线程切换,对于一个高并发服务器是无法允许这么高时间片的切换代价的。因此必须设计好服务器的框架,尽量避开使用锁机制,但要保证数据不出错。
2.多进程编程,在各个进程间会有很多通讯,跨服务器进程的异步消息较多,会让服务器的编码难度加大。
下面先按照一个游戏的功能,将服务器的功能分块框架画出来:
以上是一个游戏服务器最基础的功能框架图,接下来要做的就是设计服务器的框架了。
转载于:https://www.cnblogs.com/GmrBrian/p/3777074.html
大型网络游戏服务器的框架设计相关推荐
- 大型网络游戏服务器的框架设计(一)
服务器是用来处理高并发的请求,同时能够满足扩展的业务逻辑的需求,最重要的是满足三点:并发性,稳定性,扩展性. 经历过两款上线游戏产品,见识到了游戏行业的杂乱无章,虽然和传统软件行业相比,少了那么些规范 ...
- 【 C++ 技术】 C++ 高性能服务器网络框架设计细节
作者:范蠡 原文:C++ 高性能服务器网络框架设计细节 前言 这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序.需要注意的是一般大型服务器,其复杂程度在于其业务, ...
- 大型网络游戏服务器要具备什么条件
相对于单机游戏或者其它的局域网游戏不同,大型网络游戏的客户端不再对数据进行逻辑处理,大部分的逻辑计算都放在后端的服务器进行处理,导致玩家与后台服务器间的数据传输频次多且大多保持长时链接,服务器端的响应 ...
- 网络游戏服务器构架设计
网络游戏服务器构架设计(一):前言 这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章,主要是想给工作了两年的自己一个交代,或者说是一个阶段性的总结.两年 ...
- mysql 游戏服务器设计_网络游戏服务器数据库设计和实现.doc
网络游戏服务器数据库设计和实现 摘 要 随着的普及,网络游戏已经成为大家耳濡目染的新生事物.现在,可以说网络游戏已经成为人们休闲.娱乐的有效方式.网络游戏必须依托于互联网可以多人同时参与游戏,通过人与 ...
- 一种高性能网络游戏服务器架构设计
网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制.客户端与服务器通 ...
- 一种高性能网络游戏的的架构设计
网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制.客户端与服务器通 ...
- 其实一切与游戏无关--yy笔录+转载网络游戏服务器设计
严格的说,我从来没有玩过网络游戏,对于网游的理解仅限于大学时其他室友之间关于魔兽世界的经验交流.曾经yy过网游的后台实现方法,但现在回想起来那时的想法确实幼稚的很.两个月打酱油般的工作当中给我最深的体 ...
- ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器
ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...
- 网络游戏服务器构架设计(四):云风的轨迹
最近闲着没事把云风的< 开发笔记>看了个遍,希望能从大牛的开发轨迹中得到一些启发.但可能是因为本人level太低,一遍看下来还是云里雾里,不甚明白.没办法只好再看一遍,希望能对他们的服务器 ...
最新文章
- 前端部分面试题整理,欢迎补充
- 还在写大量 if 来判断?试试用一个规则执行器来替代它
- webkit qt版快速编译 支持wml版本
- ExtJs计算两个DateField所间隔的月份(天数) new Date(str) IE游览器提示NaN 处理...
- [转载]Android: 如何实现ScrollView中含有ListView?
- 多线程编程学习笔记——任务并行库(二)
- 针对“来用”团队项目之NABC分析
- SpringCloud:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
- 学习使用RIA Framework Flex创建MySQL管理UI(初学Flex实例教程)
- Android programming on Mac 之安装Eclipse
- 单片机的单个IO口可以发送数据吗_关于51单片机各个引脚它的功能你了解多少?...
- 双11拼团最后的福利!老用户如何解散团并加入新团!
- HDU1010-奇偶剪枝(DFS)
- 图像预处理流程与方法
- 网站备案相关问题解答
- 通过PKI实现零信任的身份认证
- 10月15号 360一面
- gitlab CI CD
- 罗振宇2021跨年演讲3:谁能跳出数字化系统困境?
- php公鸡五钱一只,PHP经典题:百钱百鸡问题(穷举算法)